[解決済み] var/nullを使ったスイッチのおかしな動作
質問
次のようなコードがあるとします。
string someString = null;
switch (someString)
{
case string s:
Console.WriteLine("string s");
break;
case var o:
Console.WriteLine("var o");
break;
default:
Console.WriteLine("default");
break;
}
なぜswitch文のマッチングは
case var o
?
私の理解では
case string s
は一致しません。
s == null
というのは、(事実上)
(null as string) != null
は false と評価されるからです。VS Codeのインテリセンスでは
o
は
string
も同様です。何かご意見はありますか?
に似ています。 C# 7 ヌルチェックによるスイッチケース
どのように解決するのですか?
パターンマッチの内部
switch
文の中で
case
を使うことは、その値が特定の型か派生型かを尋ねていることになります。 これは次のものと全く同じです。
is
switch (someString) {
case string s:
}
if (someString is string)
値
null
は型を持たないので、上記のいずれの条件も満たしません。 静的な型である
someString
の静的型はどちらの例にも当てはまりません。
は
var
を含むすべての値にマッチしますが、パターンマッチではワイルドカードとして機能します。
null
.
は
default
のケースはデッドコードです。 この
case var o
は null か non-null に関わらずどんな値にもマッチします。 デフォルトでないケースは常にデフォルトのケースに勝ります。
default
は決してヒットしません。 ILを見れば、それが出力されていないことがわかるでしょう。
一見したところ、これが警告なしでコンパイルされるのは奇妙に思えるかもしれません (間違いなく私は投げ出されました)。 しかし、これは 1.0 にさかのぼる C# の動作と一致しています。 コンパイラは
default
がヒットしないことが自明な場合でも、コンパイラは
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
ここで
default
は決してヒットしません(たとえ
bool
でさえも)ヒットすることはありません。 しかし、C#は1.0から警告なしにこれを許可しています。 パターン マッチングは、ここではこの動作に沿ったものになっているだけです。
関連
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み] Pythonでnullオブジェクトを参照する
-
[解決済み] カラムの変更:NULLをNOT NULLに変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] 2つのリストを結合する
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】Nullableオブジェクトは値を持たなければならない?