我有以下课程:
abstract class AClass { }
class Foo : AClass { }
class Bar : AClass { }
当我尝试使用它们时:
AClass myInstance;
myInstance = true ? new Foo() : new Bar();
此代码将无法编译,因为“无法确定条件表达式的类型,因为‘CSharpTest.Class1.Foo’和‘CSharpTest.Class1.Bar’之间没有隐式转换”
但以下示例编译正常:
if (true)
{
myInstance = new Foo();
}
else
{
myInstance = new Bar();
}
这也可以:
myInstance = true ? (AClass) new Foo() : new Bar();
or
myInstance = true ? new Foo() : (AClass) new Bar();
为什么条件运算符和 if 子句的行为有如此大的差异?
这是预期的行为。
既然没有隐式转换X 和 Y 之间存在(即使它们共享公共基数,它们之间也没有隐式转换),您需要显式强制转换(至少)其中之一到基类,以便存在隐式转换。
来自C#规范的详细解释:
第二个和第三个操作数?:
运算符控制条件表达式的类型。设 X 和 Y 为第二个和第三个操作数的类型。然后,
如果 X 和 Y 是相同类型,则这就是条件表达式的类型。
否则,如果存在从 X 到 Y 的隐式转换(第 6.1 节),但不存在从 Y 到 X 的隐式转换,
那么 Y 是条件表达式的类型。
否则,如果存在从 Y 到 X 的隐式转换(第 6.1 节),但不存在从 X 到 Y 的隐式转换,
那么 X 是条件表达式的类型。
否则,无法确定表达式类型,并且会发生编译时错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)