c# – 使用条件运算符时没有隐式转换

前端之家收集整理的这篇文章主要介绍了c# – 使用条件运算符时没有隐式转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题在这里已经有一个答案:> Nullable types and the ternary operator: why is `? 10 : null` forbidden? 9个
我有以下课程:
abstract class AClass { }
class Foo : AClass { }
class Bar : AClass { }

当我试图使用它们时:

AClass myInstance;
myInstance = true ? new Foo() : new Bar();

由于“CSharpTest.Class1.Foo”和“CSharpTest.Class1.Bar”之间没有隐式转换,因此无法确定条件表达式的类型,因此无法编译此代码.

但下面的示例编译ok:

if (true)
{
    myInstance = new Foo();
}
else
{
    myInstance = new Bar();
}

这也没关系

myInstance = true ? (AClass) new Foo() : new Bar();

要么

myInstance = true ? new Foo() : (AClass) new Bar();

为什么条件运算符和if子句的行为有如此大的差异?

解决方法

这是预期的行为.

由于X和Y之间不存在隐式转换(即使它们共享共同的基础,它们之间也不存在隐式转换),因此您需要将其中一个显式转换为基类,以便存在隐式转换.

来自C#规范的详细说明:

The second and third operands of the ?: operator control the type of the conditional expression. Let X and Y be the types of the second and third operands. Then,

If X and Y are the same type,then this is the type of the conditional expression.

Otherwise,if an implicit conversion (Section 6.1) exists from X to Y,but not from Y to X,
then Y is the type of the conditional expression.

Otherwise,if an implicit conversion (Section 6.1) exists from Y to X,but not from X to Y,
then X is the type of the conditional expression.

Otherwise,no expression type can be determined,and a compile-time error occurs.

原文链接:https://www.f2er.com/csharp/92566.html

猜你在找的C#相关文章