C# 泛型类型函数:返回不可为null的值

C# 泛型类型函数:返回不可为null的值,c#,generics,nullable,default-value,non-nullable,C#,Generics,Nullable,Default Value,Non Nullable,我编写了这个简单的实用函数: public static T isNull<T>(T? v, T d) { return v == null ? d : v.Value; } 而不是: int? myField = record.myField; int myValue = myField == null ? 0 : myField.Value; 我觉得我缺少了一些基本知识。是否存在完成任务的方法?可用于泛型函数,以限制允许用于某些子集的类型,这为在方法或类中如何使用这

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

public static T isNull<T>(T? v, T d)
{
    return v == null ? d : v.Value;
}
而不是:

int? myField = record.myField;
int  myValue = myField == null ? 0 : myField.Value;
我觉得我缺少了一些基本知识。是否存在完成任务的方法?

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

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

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v == null ? d : v.Value;
}
公共静态T为null(T?v,td),其中T:struct
{
返回v==null?d:v.值;
}
然而,另一个答案确实正确地指出,在这种特殊情况下,您可以选择使用空合并运算符

可用于泛型函数,以限制允许用于某些子集的类型,这为在方法或类中如何使用这些类型开辟了可能性

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

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v == null ? d : v.Value;
}
公共静态T为null(T?v,td),其中T:struct
{
返回v==null?d:v.值;
}

然而,另一个答案确实正确地指出,在这种特殊情况下,您可以选择使用空合并运算符

这称为空合并,有一个内置的操作符来执行此操作:

int myValue = record.myField ?? 0

这称为空合并,有一个内置的运算符来执行此操作:

int myValue = record.myField ?? 0

虽然其他答案很好,但您可能希望编写您的方法,以便它可以同时处理引用和值类型。您可以通过使用两个重载来实现这一点,这两个重载都带有泛型约束

public static T IsNull<T>(T v, T d) where T : class
{
    return v ?? d;
}

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v.HasValue ? v.Value : d;
}

虽然其他答案很好,但您可能希望编写您的方法,以便它可以同时处理引用和值类型。您可以通过使用两个重载来实现这一点,这两个重载都带有泛型约束

public static T IsNull<T>(T v, T d) where T : class
{
    return v ?? d;
}

public static T IsNull<T>(T? v, T d) where T : struct
{
    return v.HasValue ? v.Value : d;
}

@林恩:谢谢,在网上得到推荐信是件很痛苦的事phone@LynnCrumbling谢谢,在电话里得到推荐信很痛苦