一尘不染

是否可以将null类型用作通用参数?

c#

我想做这样的事情:

myYear = record.GetValueOrNull<int?>("myYear"),

请注意,可为null的类型为通用参数。

由于GetValueOrNull函数可以返回null,所以我的第一个尝试是:

public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
  where T : class
{
    object columnValue = reader[columnName];

    if (!(columnValue is DBNull))
    {
        return (T)columnValue;
    }
    return null;
}

但是我现在得到的错误是:

类型“ int?” 必须是引用类型,才能在通用类型或方法中将其用作参数“ T”

对!Nullable<int>是一个struct!因此,我尝试将类约束更改为struct约束(并且副作用无法再返回null):

public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
  where T : struct

现在分配:

myYear = record.GetValueOrNull<int?>("myYear");

给出以下错误:

类型“ int?” 必须是非空值类型,才能在通用类型或方法中将其用作参数“ T”

是否可以将可空类型指定为通用参数?


阅读 259

收藏
2020-05-19

共1个答案

一尘不染

将返回类型更改为Nullable,并使用non nullable参数调用该方法

static void Main(string[] args)
{
    int? i = GetValueOrNull<int>(null, string.Empty);
}


public static Nullable<T> GetValueOrNull<T>(DbDataRecord reader, string columnName) where T : struct
{
    object columnValue = reader[columnName];

    if (!(columnValue is DBNull))
        return (T)columnValue;

    return null;
}
2020-05-19