将类型param的实例与null进行比较,即使没有类约束?

The*_*edi 1 c# generics nullable

以下代码编译:

class Testing<TKey, TValue>
{
    public bool Test(TKey key)
    {
        return key == null;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,TKey可以是值类型,并且可能不允许值"null".

我知道这个程序的结果,以及如何添加约束.我想知道为什么当TKey不被约束为"类"时,编译器不会禁止这个?

Jon*_*eet 5

在各种情况下能够做到这一点很方便.如果TKey是非可空值类型,则比较结果将始终为false.(JITter可能会完全删除该分支 - 不要忘记,虽然所有引用类型共享一个版本的JITted代码,但它会为每个值类型重新命名.)

编辑:一个有趣的用途恰恰是允许Nullable<T>与null 进行比较.TFoo=Nullable<T>不满足任一where TFoo : class where TFoo : struct约束.