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

hwc*_*rwe 20 .net c# dbnull operators

我有以下C#代码:

sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

但它抛出以下编译错误:

运算符??不能应用于类型string和的操作数System.DBNull

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

Pav*_*čík 36

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

(object)table.Value ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

  • 这不是真的正确,编译错误发生的原因不是因为两个操作数都是?? 需要成为对象.没有显式强制转换(在(对象)的答案中提供),需要有一个隐式强制转换.由于字符串和System.DBNull之间没有隐式转换,因此会出现编译器错误. (9认同)
  • 不要试图挑剔,只是担心作者(谁说他知道如何绕过错误)可能会消失,认为这两个操作数都是?操作员总是需要成为对象.他的问题是*为什么*编译器不喜欢这个而不是*我如何解决它. (5认同)
  • @AndrewBarrett好吧!您如何解决?:) (2认同)

Mar*_*ers 16

有之间没有自动转换stringSystem.DBNull,所以你需要通过添加强制转换为指定要明确的类型object:

sqlCommandObject.Parameters.AddWithValue("@Parameter",
                                         table.Value ?? (object)DBNull.Value);
Run Code Online (Sandbox Code Playgroud)


And*_*ett 8

这是因为string和之间没有隐式转换System.DBNull.


Hut*_*tch 7

除了使用DBNull.Value,还可以使用Convert.DBNull:

sqlCommand.Parameters.AddWithValue("@Parameter", table.Value ?? Convert.DBNull);
Run Code Online (Sandbox Code Playgroud)

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