Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用条件运算符时没有隐式转换_C#_Oop - Fatal编程技术网

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();