33

为什么我不能像这样定义隐式和显式运算符?

    public class C
    {
        public static implicit operator string(C c)
        {
            return "implicit";
        }

        public static explicit operator string(C c)
        {
            return "explicit";
        }
    }

不过你可以做这个黑客:)

    class Program
    {
        public class A
        {

        }

        public class B
        {
            public static implicit operator A(B b)
            {
                Console.WriteLine("implicit");
                return new A();
            }
        }

        public class C : B
        {
            public static explicit operator A(C c)
            {
                Console.WriteLine("explicit");
                return new A();
            }
        }

        static void Main(string[] args)
        {
            C c = new C();

            A a = c;
            A b = (A) c;
        }
    }

这打印:

implicit
explicit
4

2 回答 2

57

检查一下:为什么不能在 C# 中同时存在相同类型的隐式和显式运算符?

如果您定义一个显式运算符,您将能够执行以下操作:

Thing thing = (Thing)"value";

如果你定义了一个隐式操作符,你仍然可以做上面的事情,但你也可以利用隐式转换:

Thing thing = "value";

简而言之,显式只允许显式转换,而隐式允许显式和隐式转换......因此您只能定义一个。

于 2012-06-05T06:48:15.070 回答
9

我不知道阻止这种情况的技术限制,但我认为他们会这样做以防止人们自爆。

string imp = new C(); // = "implicit"
string exp = (string)new C(); // = "explicit"

那会让我发疯而且毫无意义,C应该只以一种方式转换为字符串,而不是两种不同的方式。

于 2009-04-17T21:23:54.463 回答