小编典典

可空类型作为泛型参数可能吗?

all

我想做这样的事情:

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

请注意可空类型作为泛型参数。

由于该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”

是否尽可能将可空类型指定为泛型参数?


阅读 70

收藏
2022-04-08

共1个答案

小编典典

将返回类型更改为Nullable<T>,并使用不可为空的参数调用方法

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;
}
2022-04-08