可以使用可空类型作为通用参数?

我想要做这样的事情:

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'

尽可能指定一个可为空的类型作为泛型参数?


将返回类型更改为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;
}

public static T GetValueOrDefault<T>(this IDataRecord rdr, int index)
{
    object val = rdr[index];

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

    return default(T);
}

就像这样使用它:

decimal? Quantity = rdr.GetValueOrDefault<decimal?>(1);
string Unit = rdr.GetValueOrDefault<string>(2);

只需对原始代码做两件事 - 删除where约束,并将最后一次returnreturn null return default(T)return default(T) 。 这样你可以返回你想要的任何类型。

顺便说一句,您可以避免使用is通过将if语句更改为if (columnValue != DBNull.Value)

链接地址: http://www.djcxy.com/p/49121.html

上一篇: Nullable type as a generic parameter possible?

下一篇: Destroy SessionScoped CDI beans during Shiro logout