C# 使用条件运算符时没有隐式转换
我有以下课程:C# 使用条件运算符时没有隐式转换,c#,oop,C#,Oop,我有以下课程: abstract class AClass { } class Foo : AClass { } class Bar : AClass { } 当我尝试使用它们时: AClass myInstance; myInstance = true ? new Foo() : new Bar(); 此代码不会编译,因为“无法确定条件表达式的类型,因为'CSharpTest.Class1.Foo'和'CSharpTest.Class1.Bar'之间没有隐式转换” 但以下示例可以: if
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();
或
为什么条件运算符和if子句的行为有如此大的差异?三元运算符和if子句之间并没有太大的差异,这是您语句中的差异 在第一个工作示例中,您正在Foo和AClass或Bar和AClass之间进行转换,这显然很好 在第二个工作示例中,您告诉三元运算符查看AClass和Bar。在第三个工作示例中,您告诉三元运算符查看Foo和AClass。这些显然有明显的转变
在非工作示例中,您告诉它查看Foo和Bar。这里没有隐式转换(例如,因为一个不是从另一个派生的)。但是你可以继续,明确地表达它,并将其转换(这是你在第二个和第三个工作示例中所做的),因为有一个转换可用。这是预期的行为 由于X和Y之间不存在隐式转换(即使它们共享一个公共基,它们之间也不存在隐式转换),因此需要显式(至少)将其中一个转换转换为基类,以便存在隐式转换 C#规范的详细说明:
?:
运算符的第二个和第三个操作数控制条件表达式的类型。设X和Y是第二个和第三个操作数的类型。那么
如果X和Y是同一类型,则这是条件表达式的类型
否则,如果存在从X到Y的隐式转换(第6.1节),但不存在从Y到X的隐式转换,
那么Y是条件表达式的类型
否则,如果存在从Y到X的隐式转换(第6.1节),但不存在从X到Y的隐式转换,
那么X是条件表达式的类型
否则,无法确定表达式类型,并发生编译时错误。
被愚弄的,和许多其他的。
myInstance = true ? new Foo() : (AClass) new Bar();