C# 运算符'';无法应用于类型为';字符串';和';System.DBNull';
我有以下C#代码: 但它抛出以下编译错误: 运算符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("@
?
不能应用于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);