【问题标题】:Why can't I define both implicit and explicit operators?为什么我不能同时定义隐式和显式运算符?
【发布时间】:2023-03-15 03:41:01
【问题描述】:

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

    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

【问题讨论】:

  • 谁说你不能?即,当您尝试时会发生什么?
  • 为什么要在两者之间实现不同的实现?
  • 重写 ToString 甚至不接近隐式转换运算符。您的示例代码仅有效,因为 Console.WriteLine 具有对象重载并在对象上调用 ToString()。
  • 它是为了好玩,我什至在那儿放了笑脸。
  • 但是并没有达到预期的效果。如果没有显式强制转换,您不能将 C 作为字符串传递。接收代码将取决于为“隐式”运算符调用 ToString。

标签: c# operator-overloading


【解决方案1】:

检查这个:Why can't coexist implicit and explicit operator of the same type in C#?

如果你定义一个显式的操作符,你将能够做这样的事情:

Thing thing = (Thing)"value";

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

Thing thing = "value";

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

【讨论】:

  • 这应该是首选答案。
【解决方案2】:

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

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

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

【讨论】:

  • 您可以通过两种方式进行,只是不能同时进行自定义转换。
  • 不,你不能这样做,ToString 不是强制转换运算符。
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 2012-09-14
  • 2014-08-20
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多