通用类型函数:返回不可为空的值

bal*_*nza 1 c# generics nullable default-value non-nullable

我写了这个简单的实用函数:

public static T isNull<T>(T? v, T d)
{
    return v == null ? d : v.Value;
}
Run Code Online (Sandbox Code Playgroud)

目的是避免烦人的任务,例如检查成员是否为null,在读取linq记录集时非常常见.问题是它抛出了这个错误:

类型'T'必须是非可空值类型,以便在泛型类型或方法'System.Nullable <T>'中将其用作参数'T'

错误似乎是合法的,无论如何我希望我可以这样做:

int? myField = record.myField;
int  myValue = isNull(myField, 0);
Run Code Online (Sandbox Code Playgroud)

代替:

int? myField = record.myField;
int  myValue = myField == null ? 0 : myField.Value;
Run Code Online (Sandbox Code Playgroud)

我觉得我缺少一些c#基础知识.有没有办法完成我的任务?

Ant*_*ram 6

可以在泛型函数上使用泛型约束来限制允许用于某些子集的类型,这为您在方法或类中使用这些类型提供了可能性.

在这种情况下,您可以应用约束将T其限制为a struct以解决特定的编译器错误.

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v == null ? d : v.Value;
}
Run Code Online (Sandbox Code Playgroud)

但是,另一个答案确实指出您可以选择??在此特定情况下使用空合并运算符.