Null-Coalescing运算符-为什么要强制转换?
-
27-10-2019 - |
题
任何人都可以告诉我,为什么以下第一条语句引发编译错误而第二条语句没有引发编译错误吗? 通用标签
我尝试了其他可以为null的类型,例如byte?
,并获得了相同的结果。谁能告诉我为什么我需要首先投射对象?
解决方案
您需要告诉编译器要使用哪种类型。空合并运算符的结果类型必须与操作数类型的 one 相同(或在某些情况下,如果第一个操作数是可空值类型,则为基础类型)。它不会尝试找到“两个操作数都可以转换为的最特定类型”或类似的东西。
有关空合并运算符时如何定义语言的详细信息,请参见 C#4语言规范,第7.13节:
表达式
a ?? b
的类型取决于操作数上可用的隐式转换。按优先顺序排列,a ?? b
的类型是A0
,A
或B
,其中A
是a
的类型(假设a具有类型),B
是b
的类型(假设b
具有类型),如果A0
是可为空的类型,则为A
的基础类型,否则为A
。
其他提示
第一个示例失败,因为SomeString
和DBValue.Null
不是隐式可互换的类型。
这是因为null运算符右侧的类型必须隐式转换为左侧的类型(反之亦然)。对于第一个示例,涉及的类型是string
和DBNull
。这些类型无关,因此转换失败。
DBValue.Null不是字符串;这是一个对象。.NET不会在表达式中隐式转换为Object;必须明确告知您期望得到对象结果。
因为表达式需要具有单个返回类型。由于无法将String
和DbValue
相互转换,因此编译器无法确定您要返回哪种类型。转换为Object时,将为编译器提供可以转换为的类型。
不隶属于 StackOverflow