当前位置: 首页 > 知识库问答 >
问题:

如果内联使用,隐式转换中的奇怪行为[重复]

杨昆
2023-03-14

我有一个奇怪的行为,我想了解它。但我在网上没有找到好的答案:(

情况是这样的,我抽象了名称和逻辑来关注这个问题。有三种类型,A型,B型和c型

public class A
{
    public static implicit operator A(B input){ /* Convert B to A */ }
    public static implicit operator A(C input) { /* Convert C to A*/ }
}

public class B { }
public class C { }

然后,当我这样做时,代码编译并正常工作:

A myObject = null;
if (condition)
    myObject = new B();
else
    myObject = new C();

但当我用内联if编写相同的逻辑时,我得到了一个错误:

A myObject = condition ? new B() : new C();

错误:

Type of conditional expression cannot be determined because there is no implicit conversion between 'B' and 'C'

你对这种行为有什么想法吗?

提前感谢您的宝贵时间。

最好的问候,并保持它的错误自由!

共有3个答案

仲孙兴旺
2023-03-14

您可以看看?中的备注:运算符(C#参考)它指出

要么first_expression和second_expression的类型必须相同,要么必须存在从一种类型到另一种类型的隐式转换。

慕容齐智
2023-03-14

错误很明显

“B”和“C”之间没有隐式转换

您已经定义了AB以及AC之间的隐式转换。但是BC之间没有隐式转换。

条件运算符要求:

要么first_expression和second_expression的类型必须相同,要么必须存在从一种类型到另一种类型的隐式转换。

叶裕
2023-03-14

你对这种行为有什么想法吗?

绝对地条件运算符表达式的类型必须是第二个操作数的类型或第三个操作数类型。(如果这两种类型不相同,则必须将其中一种类型隐式转换为另一种类型。)编译器不会试图找到“较低的公分母”类型,结果的使用也不重要(编译器不会“注意”您将结果分配给a类型的变量)。

您可以通过显式转换任一操作数来解决这个问题:

A myObject = condition ? (A) new B() : new C();

A myObject = condition ? new B() : (A) new C();

请注意,这不限于用户定义的转换运算符;基于派生类的简单引用转换也是如此:

Button x = new Button();
String y = "foo";
object z = condition ? x : y; // Compile-time error

有关详细信息,请参见C#规范的第7.14节。

 类似资料:
  • 好的,最近我在寻找一种在PowerShell中实现空合并的方法,我遇到了这篇文章:在PowerShells中实现空聚合。 我看到了@Zenexer的评论,很感兴趣。语法如下: 这非常有效。然而,我的一位同事(沃尔特·帕克特)和我非常感兴趣,对语法做了更多的挖掘,发现了一些真正的奇怪之处。 在我进入怪异之前,任何人都可以指出任何解释这种语法的文档吗? 经验教训: < li >测试应该进入数组的最后一

  • 我有一个ui显示的数据表:repeat。因为我希望用户能够在每行的基础上更改数据,所以每行都包含在一个h:form中。最后,每个h:form都有一个带有f:ajax标记的按钮。我的行为越来越不一致。 上述方法可行,但带宽显然不便宜。 如果我将render=“@all”更改为render=“@form”,Firebug显示发送的部分响应正常,但我的浏览器(Firefox)神秘地没有显示它。所以我猜它

  • 我遇到了奇怪的问题时,铸造小数到双倍。 以下代码返回true: 但是,当我将其强制转换为双倍时,它返回false: 这是记录在案的行为吗?当我被迫将decimal转换为Double时,我如何避免它? Visual Studio的截图: 将Math.round铸造为双倍me,结果如下: null 不幸的是,我不能在较小的项目中重现这个问题。我想埃里克的回答解释了原因。

  • 矩形填充的图像改变其比例(宽度和高度改变)。 这显示了转换前后的svg。 有没有人有办法解决这个问题?

  • 我使用的是Java8。 我最近遇到了这个问题: 这不会抛出java.lang.ClassCastException,为什么呢? 我总是想<code>和<code>System.out。println调用。但当我尝试这样做时,它会像预期的那样抛出异常。

  • 问题内容: 这个问题已经在这里有了答案 : 为什么对泛型的这种使用不会引发运行时或编译时异常? (3个答案) 2年前关闭。 我正在使用Java 8。 我最近遇到了这个问题: 这不会引发java.lang.ClassCastException。这是为什么? 我一直在想和打电话。但是,当我尝试这样做时,它会按预期抛出异常。 问题答案: 它不会抛出,因为所有通用类型信息都已从编译后的代码中剥离(此过程称