Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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#_.net_Operators_Dbnull - Fatal编程技术网

C# 运算符'';无法应用于类型为';字符串';和';System.DBNull';

C# 运算符'';无法应用于类型为';字符串';和';System.DBNull';,c#,.net,operators,dbnull,C#,.net,Operators,Dbnull,我有以下C#代码: 但它抛出以下编译错误: 运算符?不能应用于string和System.DBNull 为什么编译器不允许这种语法?这是因为string和System.DBNull这两个操作数都必须是对象。使用显式强制转换: (object)table.Value ?? DBNull.Value; string和System.DBNull之间没有自动转换,因此需要通过向对象添加强制转换来明确指定所需的类型: sqlCommandObject.Parameters.AddWithValue("@

我有以下C#代码:

但它抛出以下编译错误:

运算符
不能应用于
string
System.DBNull


为什么编译器不允许这种语法?

这是因为
string
System.DBNull
这两个操作数都必须是对象。使用显式强制转换:

(object)table.Value ?? DBNull.Value;

string
System.DBNull
之间没有自动转换,因此需要通过向
对象添加强制转换来明确指定所需的类型:

sqlCommandObject.Parameters.AddWithValue("@Parameter",
                                         table.Value ?? (object)DBNull.Value);

您可以使用Convert.DBNull,而不是使用DBNull.Value:

sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? Convert.DBNull);

我相信在幕后,它基本上做了与其他示例中提到的相同/类似的事情(即将DBNull转换为object),但它使它变得更简单/简洁。

另一个解决方法是利用
SqlString.Null

例如:
command.Parameters.Add(新的SqlParameter(“@parameter”,参数??SqlString.Null))


每种类型都有自己的版本
SqlGuid.Null
SqlDateTime.Null
,等等

这不是真的正确,发生编译错误的原因不是因为两个操作数??必须是对象。这是因为如果没有显式转换(在(object)的答案中提供),就需要有一个隐式转换可用。由于string和System.DBNull之间没有隐式强制转换,因此会出现编译器错误。不要挑剔,只是担心作者(他说他知道如何绕过错误)可能会认为两个操作数都是??运算符始终需要是对象。他的问题是编译器为什么不喜欢这个,而不是如何修复它。可能值得在
DBNull.Value
上执行强制转换。i、 e.
table.Value??(object)DBNull.Value
仍然可以帮助编译器了解所需的内容,这样,只有在预期值为null时才会发生转换。可能是因为
运算符希望两边的类型相同?
sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? Convert.DBNull);