【发布时间】:2023-03-12 01:52:02
【问题描述】:
一个similar question,但没有转换 T 参数。
这不起作用
public T GetValueG<T>(string Query)
{
object value = DBNull.Value; // Read from Database which can return DBNull
if (value is DBNull)
return (T)null;
else
return (T)value;
}
错误 CS0037 无法将 null 转换为 'T',因为它是不可为空的值类型
但这行得通
public T GetValueG<T>(string Query)
{
object value = DBNull.Value; // Read from Database which can return DBNull
if (value is DBNull)
value = null;
return (T)value;
}
我知道使用约束类型 where T: struct 将使 T 能够直接使用 null 进行强制转换。
但是在第二种方法中,为什么它接受一个 100% 可以为空的对象?为什么我不能不带对象或其他东西直接返回null?
【问题讨论】:
-
你为什么要首先做
(T)null?返回default(T)或返回 null。 -
default(T) 整数和小数返回零。我不需要那个.. 如果它不是可以为空的泛型类型,geenric-type 也不能返回 null。我想为任何数据库阅读器接受 null 。不是默认值。
-
我同意,在这种情况下,返回
default(T)可能是最好的选择,但不知道为什么需要专门为null的更多细节。 -
Matt U 和 Adriani6,伙计们,我不想默认类型。我总是为 DBNulls 返回 null。就这样 ! :)
-
@deveton 但是您不能将 null 分配给整数.. 除非它是一个可为空的整数..
GetValueG<int?>()然后将default(T)作为您的回报。事实上,将泛型类型设置为int?bool?等就足以返回null而无需强制转换 - 但这显然会留下一个可能的异常。
标签: c# .net generics null nullable