我想做这样的事情:
myYear = record.GetValueOrNull<int?>("myYear"),
请注意可空类型作为泛型参数。
由于该GetValueOrNull函数可以返回 null 我的第一次尝试是这样的:
GetValueOrNull
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):
Nullable<int>
struct
null
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName) where T : struct
现在的任务:
myYear = record.GetValueOrNull<int?>("myYear");
给出以下错误:
类型’int?必须是不可为空的值类型才能将其用作泛型类型或方法中的参数“T”
是否尽可能将可空类型指定为泛型参数?
将返回类型更改为Nullable<T>,并使用不可为空的参数调用方法
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; }