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";