Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我不能使用'';System.DBNull值的操作数?_C#_Oracle_Dbnull - Fatal编程技术网

C# 为什么可以';我不能使用'';System.DBNull值的操作数?

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在本质上不是相同的吗

我有一个Oracle数据表,它获取的列为空。所以我想让代码保持简洁,我会使用??操作数。AlternatePhoneNumber是我的C#模型中的一个字符串

然而,即使使用了该代码,我仍然会得到错误

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( "" );