将T与null进行比较时,CLR会做什么,而T是结构?

Fel*_*oto 8 c# generics clr

private static void SaveOrRemove<T>(string key, T value)
{
    if (value == null)
    {
        Console.WriteLine("Remove: " + key);
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

如果我调用0传递给值:SaveOrRemove("MyKey", 0),条件value == null为假,那么CLR不会产生value == default(T).真的发生了什么?

Jon*_*eet 10

当T是不可为空的值类型时,JIT编译器基本上删除任何与null的比较,假设它们都是false.(可以为Nullable的值类型将与该类型的null值进行比较,这可能是您所期望的.)

如果您希望它与默认值进行比较,您可以使用:

if (EqualityComparer<T>.Default.Equals(value, default(T))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 5

您的问题在C#规范的第7.9.6节中得到了解答:

如果将类型参数类型T的操作数与null进行比较,并且T的运行时类型是值类型,则比较结果为false.

  • @Fujiy:你提出了一个很好的观点.这种情况缺少规范.我将把它引起规范作者的注意. (3认同)
  • @Joan:我们写的是规范.Mads做了大部分的写作工作.其他人偶尔会像我一样帮忙,或者是VB规范的领导者Lucian.像这样的小变化 - 只需将"值类型"更改为"非可空值类型" - 可能只会进入Mads的拼写错误列表进行修复.更大的变化通过设计委员会来确保文本是我们想要的方式. (2认同)