2017-03-22 17 views
7

C#7は、あなたがされ、式で使用したり、このようなケースを切り替えることができますパターンを、と呼ばれる新機能が導入されました:C#7スイッチケース

string str = null; 
switch(str){ 
    case string x: 
     Console.WriteLine("string " + x); 
     break; 
    default: 
     Console.WriteLine("default"); 
     break; 
} 

、あなたはそれをすることを期待します同じタイプなので、ケース#1の中に入っていますが、同じタイプではありません。

+1

"それは同じタイプである" - 実際はそうではありません。 'object o = str;を実行すると、 bool isString = oは文字列です; '次に' isString'はfalseになります... –

+0

はい、正しく、null文字列がSystem.Stringオブジェクトを参照していません – MAbdulHalim

+0

@JonSkeet、レビューする。 – MAbdulHalim

答えて

0

実際には、文字列でnullが原因ではありません。

アイデアは、C#7のパターンとスイッチ例は例を評価しながらヌルがチェックするための別のケースを追加し、あなたがヌルの場合チェックを追加しなかった場合、それはデフォルト場合に行くということですしたがって、この新しい機能を使用している間にヌルケースを追加する方が良いでしょう。デフォルトの設定が分かっている場合は、デフォルトにしておいてください。

希望すると助かります!あなたが考えるかもしれないものにもかかわらず

+2

いいえ、それはその背後にあるアイデアではありません。事は.NETがどのようにして動作するかです。このパターンがどのように実装されているかを説明した私の答えを見てください。 –

14

string x = nullは実際にすべての文字列ではありません。それは文字列型の変数に代入された「何もない」ものです。

スイッチのチェックは、基本的にはnull is stringと同じですが、すでに長時間の間はfalseです。ジェネリックスで型を評価するときによくある問題ですが、プラス面もあります。ボンネットの下に

isがnullチェックして、asを使用しています。だからこそ、それは真実を返すことができないのです。 is演算子のロジックは、次のようになります。

is = (null as string) != null 
+0

ありがとう@パトリック・ホフマンと私は1つを提供していない場合はnullのケースを作成するという概念。これは正しいです? – MAbdulHalim

+0

はい。それが唯一の選択肢です。 –

+0

Thanks @ patrick-hofman – MAbdulHalim