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)
您的问题在C#规范的第7.9.6节中得到了解答:
如果将类型参数类型T的操作数与null进行比较,并且T的运行时类型是值类型,则比较结果为false.
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |