当前位置: 首页 > 编程语言 > C#

NoImplicitConversionsWhenUsingConditionalOperators分享

时间:2023-04-10 19:19:26 C#

NoImplicitConversionsWhenUsingConditionalOperators使用它们:AClassmyInstance;我的实例=真?新的Foo():新的酒吧();此代码将无法编译,因为“无法确定条件表达式的类型,因为‘CSharpTest.Class1.Foo’和‘CSharpTest.Class1.Bar’”但以下示例编译正常:if(true){myInstance=newFoo();}else{myInstance=newBar();这也很好:myInstance=true?(AClass)newFoo():newBar();或myInstance=true?newFoo():(AClass)newBar();为什么条件运算符和if子句的行为会有如此大的差异?这是预期的行为。由于X和Y之间没有隐式转换(即使它们共享一个公共库,它们之间也没有隐式转换),因此需要将其中一个显式转换为基类,以便进行隐式转换。C#规范详解:?:运算符的第二个和第三个操作数控制条件表达式的类型。令X和Y为第二个和第三个操作数的类型。然后,如果X和Y是同一类型,那么这就是条件表达式的类型。否则,如果存在从X到Y的隐式转换(§6.1),但不存在从Y到X的隐式转换,则Y是条件表达式的类型。否则,如果存在从Y到X的隐式转换(§6.1),但不存在从X到Y的隐式转换,则X是条件表达式的类型。否则无法确定表达式类型,会出现编译时错误。三元运算符和if子句之间没有太大区别,它会影响您的陈述。在您的第一个工作示例中,您在Foo和AClass或Bar和AClass之间进行转换,这显然没问题。在第二个工作示例中,您告诉三元运算符查看AClass和Bar。在第三个工作示例中,您告诉三元运算符查看Foo和AClass。那些显然有明显的转换。在非工作示例中,您告诉它查看Foo和Bar。那里没有隐式转换(例如,因为一个不是从另一个派生的)。但是您可以继续并对其进行显式转换(这是您在第二个和第三个工作示例中所做的),因为可以进行转换。以上是C#学习教程:使用条件运算符时没有隐式转换。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: