1. ホーム
  2. c#

[解決済み] なぜis演算子はnullを与えるとfalseを返すのですか?

2022-06-01 08:20:50

質問

どうやら is 演算子は少し矛盾しています。

bool Test()
{
    // Returns false, but should return true.
    return null is string;
}

期待されるのは null の値は任意の参照(または null 可能)型に属すると予想されます。そして実際、C#言語仕様はこの仮説を裏付けるようなことを、例えば(6.1.6 Implicit reference conversions)述べています。

暗黙的な参照変換は

...

- nullリテラルから任意の参照型へ。

の説明(7.10.10 The is演算子)は、以下のようになります。 is 演算子の説明では、まず式 (E is T) からの参照変換が行われたときに真になることを示します。 E から T が存在する場合、著者らは続けて、明示的に Enull リテラルであるか null の値です。

なぜそのようなことをするのでしょうか?私には直感に反しているように思えます。

どのように解決するのですか?

この質問は 2013年5月30日の私のブログの主題でした。 . 素晴らしい質問をありがとうございました。


あなたは誰もいない車道を見つめています。

誰かがあなたに、「あなたの私道にはホンダのシビックが停まるのか?

はい、はい、できます。

誰かが第二の車道を指さす。それも空っぽです。彼らは、「私の私道の現在の内容は、あなたの私道に収まりますか」と尋ねます。

はい、もちろんです。両方の車道は空です! なぜなら、そもそもどちらにも中身がないのですから。

誰かがあなたに、「あなたの私道にはホンダのシビックがありますか」と尋ねます。

いいえ、入っていません。

あなたが考えているのは is 演算子が2番目の質問に答えます。 この値が与えられたら、その型の変数に収まるか? null参照は、この型の変数に収まるか?はい、そうです。

という質問ではありません。 is 演算子が答える問題ではありません。演算子が答える質問は is 演算子が答える質問は、3番目の質問です。 y is X は"を尋ねない。 y 型の変数の正当な値である X ? "を問うものである。 y 型のオブジェクトへの有効な参照か? X ? への有効な参照ではないので、NULL参照は のいずれかになります。 オブジェクトの 任意の 型のオブジェクトの場合、答えは「no" 」です。その私道は空っぽで、ホンダ シビックは入っていません。

別の見方をすると y is X という質問に答えるものです。 y as X と言った場合、非 null の結果が得られるでしょうか? y が null の場合、答えは明らかに「いいえ」です!


あなたの質問をもう少し深く見るために

NULL値が参照(またはNULL可能)な型に属していることを期待します。

人は暗黙のうちに タイプ 値のセット であり、その 割り当ての互換性 は、X型の変数に値yを代入することで、以下のようになります。 yがセットxのメンバーであるかどうかをチェックする .

これは型を見る上で非常に一般的な方法ですが、これは だけです。 ではありませんし、C#が型を見る方法でもありません。C#では、Null参照はどの型にも属さないメンバです。 代入の互換性 ではなく は、単にセットに値が含まれているかどうかをチェックするだけです。ただ、ヌル参照は 代入互換性がある という関係と "is assign compatible with" 関係は明らかに多くの重複がありますが、CLR では同一ではありません。

もし型理論についての考察に興味があるなら、このテーマについての私の最近の記事をチェックしてください。

型(quot)って何?パート 1

あなたの言う「"型"」とは何ですか?後編