我想做这样的事情:
myYear = record.GetValueOrNull<int?>("myYear"),
Run Code Online (Sandbox Code Playgroud)
请注意可空类型作为通用参数.
由于该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;
}
Run Code Online (Sandbox Code Playgroud)
但我现在得到的错误是:
类型'int?' 必须是引用类型才能在泛型类型或方法中将其用作参数"T"
对!Nullable<int>是一个struct!所以我尝试将类约束更改为struct约束(并且副作用不能再返回null):
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : struct
Run Code Online (Sandbox Code Playgroud)
现在任务:
myYear = record.GetValueOrNull<int?>("myYear");
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
类型'int?' 必须是非可空值类型才能在泛型类型或方法中将其用作参数"T"
是否可以将可空类型指定为通用参数?
所以我有这门课:
public class Foo<T> where T : ???
{
private T item;
public bool IsNull()
{
return item == null;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找一种类型约束,允许我将所有内容都用作类型参数null.这意味着所有引用类型以及所有Nullable(T?)类型:
Foo<String> ... = ...
Foo<int?> ... = ...
Run Code Online (Sandbox Code Playgroud)
应该是可能的.
使用class类型约束只允许我使用引用类型.
附加信息:
我正在编写管道和过滤器应用程序,并希望使用null引用作为传递到管道的最后一项,以便每个过滤器可以很好地关闭,进行清理等...