首页 > 解决方案 > 选择使用哪个模棱两可的用户定义转换运算符的 C# 语法是什么?

问题描述

在 C# 中,如果有不明确的用户定义转换运算符,可以从调用站点中选择其中一个吗?

考虑这个例子(类似于从 X 转换为 Y 时在 .NET中的不明确的用户定义的转换和不明确的用户定义的转换中的示例。C# .Net )

using System;

static class Program {
    class A {
        static public explicit operator A(B value) {
            Console.WriteLine("A");
            return new A();
        }
    }
    class B {
        static public explicit operator A(B value) {
            Console.WriteLine("B");
            return new A();
        }
    }
    public static void Main() {
        A a = (A)new B();
    }
}

如果其中一个运算符被注释掉,代码将编译。这是一个理论上的问题(实际的解决方案是不要有模棱两可的转换运算符),但是调用站点是否有一些特殊的语法可以专门调用其中一个(通过编辑(A)new B())?还是不可能并强制重写课程?

标签: c#type-conversionoperator-overloading

解决方案


C# 语言规范是这样说的:

  • 如果 U 恰好包含一个用户定义的从 SX 转换为 TX 的转换运算符,那么这是最具体的转换运算符。
  • 否则,如果 U 恰好包含一个从 SX 转换为 TX 的提升转换运算符,那么这是最具体的转换运算符。
  • 否则,转换不明确并出现编译时错误。

所以,基本上这是无效的代码,编译器会拒绝接受它。


推荐阅读