Null-Coallescing运算符 - 为什么选择铸造?

B.M*_*B.M 4 .net c# casting nullable null-coalescing-operator

任何人都可以请告诉我为什么以下第一个语句抛出编译错误而第二个不抛出?

NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, SomeString ?? DBNull.Value); // <-- Throws compilation error!
NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, (object)(SomeString) ?? DBNull.Value); // <-- Compiles!
Run Code Online (Sandbox Code Playgroud)

我尝试了其他可以为空的类型,byte?并得到了相同的结果.任何人都可以告诉我为什么我需要先投射到物体?

Jon*_*eet 10

您需要告诉编译器要使用的类型.空合并运算符的结果类型必须与其中一个操作数类型(或第一个操作数的基础类型,如果它是可以为空的值类型,在某些情况下)相同.它不会尝试找到"两个操作数都可以转换为"的最具体类型或类似的东西.

有关如何在空合并运算符中定义语言的详细信息,请参阅C#4语言规范,第7.13节:

表达式的类型a ?? b取决于操作数上可用的隐式转换.按优先顺序排列,所述类型的a ?? bIS A0,AB,其中A是的式a(前提是一个具有类型),B是的类型b(其中,b有一个类型)和A0为基础类型的A,如果A是空类型或者A其他.


use*_*116 9

第一个示例失败,因为SomeString并且DBValue.Null不是隐式可互换的类型.