任何人都可以告诉我,为什么以下第一条语句引发编译错误而第二条语句没有引发编译错误吗? 通用标签

我尝试了其他可以为null的类型,例如byte?,并获得了相同的结果。谁能告诉我为什么我需要首先投射对象?

有帮助吗?

解决方案

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

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

表达式a ?? b的类型取决于操作数上可用的隐式转换。按优先顺序排列,a ?? b的类型是A0AB,其中Aa的类型(假设a具有类型),Bb的类型(假设b具有类型),如果A0是可为空的类型,则为A的基础类型,否则为A

其他提示

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

这是因为null运算符右侧的类型必须隐式转换为左侧的类型(反之亦然)。对于第一个示例,涉及的类型是stringDBNull。这些类型无关,因此转换失败。

DBValue.Null不是字符串;这是一个对象。.NET不会在表达式中隐式转换为Object;必须明确告知您期望得到对象结果。

因为表达式需要具有单个返回类型。由于无法将StringDbValue相互转换,因此编译器无法确定您要返回哪种类型。转换为Object时,将为编译器提供可以转换为的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top