11

(型の変数)がnull可能でない場合、なぜinteger == nullC#で有効なブール式なのですか? (私は反対ではありません。実際、私はそれが好きですが、それが可能だとは知りませんでした)integerint

4

2 に答える 2

19

それ自体intnull 非許容ですが、null 許容の への暗黙的な変換がint?あります。

その時点で、構造体が==両側で同じ型の演算子を宣言している場合は、null 許容型でも機能するように解除されます。

したがって、これはコンパイルされません:

public struct Foo {}

class Test
{
    static void Main()
    {
        Foo x = new Foo();
        if (x == null)
        {
            ...
        }
    }
}

...しかし、Fooいくつかの演算子を指定すると、コンパイルされ、警告は表示されません:

public struct Foo
{
    public static bool operator ==(Foo x, Foo y) { return true; }
    public static bool operator !=(Foo x, Foo y) { return false; }
    public override bool Equals(object x) { return false; }
    public override int GetHashCode() { return 0; }
}

コンパイラは RHS が null であることを認識しているため、演算子の呼び出しはコンパイルされたコードに含まれません。

したがって、上記の形式のコード ( Foonull 非許容の任意のものに置き換えることができますstruct) は、MS C# 5 コンパイラで次の 3 つの結果のいずれかになります。

  • 警告 CS0472 (例: 付きint)
  • エラー CS0019 (オーバーロードしないカスタム型==)
  • クリーン コンパイル (と==を含むGuidをオーバーロードするカスタム型DateTime)

ただし、コンパイラが一部の「既知の」型を通常の構造体とは異なる方法で扱う理由は明らかではありません。編集:エリックがコメントで指摘したように、これは C# コンパイラの既知のバグであり、Roslyn で修正されることを願っています。

于 2013-06-18T21:49:03.370 に答える
1

Ed が言及しているように、警告がありますが、その警告はその理由をほのめかしintint?nullますint?

于 2013-06-18T21:49:24.970 に答える