8

重複の可能性:
C# は値の型を null と比較しても問題ありません

ちょうど今、C# (4.0) コンパイラで奇妙なことを発見しました。

int x = 0;
if (x == null) // Only gives a warning - 'expression is always false'
    x = 1;

int y = (int)null; // Compile error
int z = (int)(int?)null; // Compiles, but runtime error 'Nullable object must have a value.'

に代入できない場合nullintなぜコンパイラはそれらを比較できるのですか (警告のみが表示されます)。

興味深いことに、コンパイラは次のことを許可しません。

struct myStruct
{
};

myStruct s = new myStruct();
if (s == null) // does NOT compile
    ;

structサンプルはコンパイルできないのに、サンプルはコンパイルできるのはなぜintですか?

4

2 に答える 2

6

比較が行われると、コンパイラは、可能であれば、比較の両方のオペランドが互換性のある型を持つようにしようとします。

int値と定数null値 (特定の型はありません) がありました。2 つの値の間の唯一の互換性のある型は、とint?強制されint?、 として比較されるためint? == int?です。としてのいくつかのint値は、int?間違いなく非 null であり、null間違いなく null です。コンパイラはそれを認識し、null 以外の値は明確な値と等しくないためnull、警告が表示されます。

于 2013-01-24T03:52:47.657 に答える
1

実際にコンパイルすると、'int?' の比較が可能になります。'int' ではなく 'int' を null にするのは理にかなっています

例えば

        int? nullableData = 5;
        int data = 10;
        data = (int)nullableData;// this make sense
        nullableData = data;// this make sense

        // you can assign null to int 
        nullableData = null;
        // same as above statment.
        nullableData = (int?)null;

        data = (int)(int?)null;
        // actually you are converting from 'int?' to 'int' 
        // which can be detected only at runtime if allowed or not

そしてそれがあなたがやろうとしていることですint z = (int)(int?)null;

于 2013-01-24T03:58:59.790 に答える