Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我不能同时定义隐式运算符和显式运算符吗?_C#_Operator Overloading - Fatal编程技术网

C# 为什么可以';我不能同时定义隐式运算符和显式运算符吗?

C# 为什么可以';我不能同时定义隐式运算符和显式运算符吗?,c#,operator-overloading,C#,Operator Overloading,为什么我不能像这样定义隐式运算符和显式运算符 public class C { public static implicit operator string(C c) { return "implicit"; } public static explicit operator string(C c) { return "explicit";

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

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

        public static explicit operator string(C c)
        {
            return "explicit";
        }
    }
不过,您可以执行以下操作:)

这张照片是:

implicit
explicit

我不知道是什么技术限制阻止了这一点,但我认为他们这样做是为了防止人们开枪自杀

string imp = new C(); // = "implicit"
string exp = (string)new C(); // = "explicit"
这会让我发疯,毫无意义,
C
应该只向一个字符串的方向施放,而不是向两个不同的方向施放。

检查以下内容:

如果定义显式运算符,则可以执行以下操作:

Thing thing = (Thing)"value";
如果定义隐式运算符,则仍可以执行上述操作,但也可以利用隐式转换:

Thing thing = "value";

简而言之,显式只允许显式转换,而隐式同时允许显式和隐式转换。。。这就是为什么你只能定义一个。

谁说你不能?也就是说,当您尝试时会发生什么?为什么您希望在这两者之间有不同的实现?重写ToString甚至与隐式cast运算符不太接近。您的示例代码之所以有效,是因为Console.WriteLine有一个对象重载,并对该对象调用ToString()。它是为了好玩,我甚至在那里放置了smily face。但它没有达到预期的效果。在没有显式强制转换的情况下,不能将C作为字符串传递。接收代码将依赖于为“隐式”运算符调用ToString。您可以通过两种方式执行此操作,但不能同时为这两种操作执行自定义转换。不,您不能执行此操作,ToString不是强制转换运算符。这应该是首选答案。
Thing thing = "value";