我为什么不能使用'? system.dbnull值的操作数?
题
我有一个 Oracle 数据表,获取的列为空。所以我想保持代码的美观和简单,我会使用 ??操作数。AlternatePhoneNumber 是我的 C# 模型中的一个字符串。
AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
但是,即使使用该代码我仍然收到错误。
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
我知道该错误意味着什么,但为什么?不能在 DBNull 上使用?null 和 DBNull 本质上不是一样的吗?
谢谢。
解决方案
这 ??
运算符仅适用于实际 null
s。
null
和 DBNull.Value
不一样; DBNull.Value
只是一个占位符对象。
此外,该异常来自内部 AlternatePhoneNumber
财产,在你之前 ??
运算符执行。(您的代码没有强制转换)。
如果 customer
是类型化数据集中的一行,更改列的 NullValue
设计师的财产。
其他提示
null和dbnull不相同。system.dbnull是一个实际对象。
问题是 AlternatePhoneNumber
是一个字符串。DBNull 不是。
试试这个:
AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
这样做:
public T IfNull<T>(object o, T value)
{
return (o == DbNull.Value) ? value : (T)o;
}
. DBNull 是一种具有单个值的类型,与空字符串引用不同,这就是为什么您不能使用 ??
. 。不过你可以这样做:
string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
正如其他回复所述, null
表示没有引用任何对象的引用,而 DBNull
是 ADO.NET 提供的一个类 表明 当数据库(或数据表)中的字段或值为 NULL 时。
虽然您可以使用 条件(三元)运算符 (?:) 做你想做的事:
AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull
? ""
: customer.AlternatePhoneNumber;
我倾向于将其概括为 扩展方法:
static class NullExtensions
{
public static T WhenNull<T>( this object value, T whenNullValue )
{
return (value == null || value is DBNull)
? whenNullValue
: (T)value;
}
}
我发现这使得代码更容易阅读和理解。
AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
dbnull不是一个真正的“null”。
“??” - 运算符仅检测为null - 引用,而不是模拟“空”行为的对象。
不隶属于 StackOverflow