C# 为什么可以';我不能使用'';System.DBNull值的操作数?
我有一个Oracle数据表,它获取的列为空。所以我想让代码保持简洁,我会使用??操作数。AlternatePhoneNumber是我的C#模型中的一个字符串 然而,即使使用了该代码,我仍然会得到错误C# 为什么可以';我不能使用'';System.DBNull值的操作数?,c#,oracle,dbnull,C#,Oracle,Dbnull,我有一个Oracle数据表,它获取的列为空。所以我想让代码保持简洁,我会使用??操作数。AlternatePhoneNumber是我的C#模型中的一个字符串 然而,即使使用了该代码,我仍然会得到错误 System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'. 我知道错误的意思,但为什么是??在DBNull上不可用?null和DBNull在本质上不是相同的吗
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) ?? ""
DBNull是一个具有单个值的类型,与空字符串引用不同,这就是为什么不能使用
??
。但是,您可以这样做:
string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
这样做:
public T IfNull<T>(object o, T value)
{
return (o == DbNull.Value) ? value : (T)o;
}
public T IfNull(对象o,T值)
{
返回值(o==DbNull.Value)?值:(T)o;
}
与其他回复状态一样,null
表示不引用任何对象的引用,而DBNull
是ADO.NET提供的一个类,用于指示数据库(或数据表)中的字段或值何时为null
虽然您可以使用来做您想做的事情:
AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull
? ""
: customer.AlternatePhoneNumber;
我倾向于用一个:
DBNull不是真正的“null”
“?”运算符只检测空引用,而不检测模拟“空”行为的对象。此代码在许多级别上都是错误的
DBNull
资本化错误。你不应该费心打电话给.Equals
Customer
既不是DBNull
也不是string
。AlternatePhoneNumber
属性已经是字符串。这不会有帮助。如果它是字符串,那么它不能是DBNull。这不会编译AlternatePhoneNumber
是一个字符串。@SLaks:哪个部分不会编译?扩展方法接受对象
,并返回与默认值匹配的类型。customer.AlternatePhoneNumber为DBNull
不会编译,因为它是静态类型的字符串
。您的扩展方法没有帮助,因为异常来自属性内部。@SLaks:啊,我明白您的意思了。Ye,在这种情况下,OP需要更改属性的实现。什么是您的客户
对象?没有客户对象,因为它是我在数据集中拥有的对象。我只是使用生成的适配器和提供的数据表类来获取数据。然后您应该在设计器中更改列的NullValue模式。哇,回答得好。谢谢你的深入回答。
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( "" );