接线员'??'不能应用于'string'和'System.DBNull'类型的操作数

时间:2010-11-11 09:37:47

标签: c# .net operators dbnull

我有以下C#代码:

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

但它会引发以下编译错误:

  

运营商??无法应用于stringSystem.DBNull类型的操作数

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

5 个答案:

答案 0 :(得分:34)

两个操作数都需要是对象。使用显式强制转换:

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

答案 1 :(得分:16)

stringSystem.DBNull之间没有自动转换,因此您需要通过向object添加强制转换来明确指定您想要的类型:

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

答案 2 :(得分:7)

这是因为stringSystem.DBNull之间没有隐式转换。

答案 3 :(得分:6)

可以使用Convert.DBNull代替使用DBNull.Value:

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

我相信,在幕后它基本上是在做其他示例中提到的相同/相似的事情(即,将DBNull强制转换为对象),但是这使其更简单/更容易。

答案 4 :(得分:0)

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

例如:command.Parameters.Add(new SqlParameter("@parameter", parameter ?? SqlString.Null));

每种类型都有其自己的版本。 SqlGuid.NullSqlDateTime.Null