使用泛型类型检查默认值

Str*_*ior 9 c# generics

我希望能够检查值是否是其值类型的默认值.理想情况下,我想说:

DoSomething<TValue>(TValue value) {
    if (value == default(TValue)) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器抱怨它无法==在TValue和TValue上进行比较.这是我迄今为止提出的最好的解决方法:

DoSomething<TValue>(TValue value) {
    if (value == null || value.Equals(default(TValue))) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有更优雅/正确的方法来解决这个问题?

Bry*_*tts 39

public bool EqualsDefaultValue<T>(T value)
{
    return EqualityComparer<T>.Default.Equals(value, default(T));
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*ion 5

加入类约束,它应该可以工作。

public void Test<T>(T instance) where T : class
{
    if (instance == default(T))
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

或者如果你只想要值类型,你可以这样做。

public void Test<T>(T instance) where T : struct, IEquatable<T>
{
    if (instance.Equals(default(T)))
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你抛出 `class` 约束,你也可以只检查 `null` ... (4认同)