Pra*_*ter 31 c# operator-overloading
为什么我不能像这样定义隐式和显式运算符?
public class C
{
public static implicit operator string(C c)
{
return "implicit";
}
public static explicit operator string(C c)
{
return "explicit";
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样做虽然:)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这打印:
implicit
explicit
Run Code Online (Sandbox Code Playgroud)
Tom*_*duy 51
检查一下:为什么不能在C#中共存相同类型的隐式和显式运算符?
如果您定义了一个显式运算符,您将能够执行以下操作:
Thing thing = (Thing)"value";
Run Code Online (Sandbox Code Playgroud)
如果您定义了一个隐式运算符,您仍然可以执行上述操作,但您也可以利用隐式转换:
Thing thing = "value";
Run Code Online (Sandbox Code Playgroud)
简而言之,explicit只允许显式转换,而implicit允许显式和隐式...因此你只能定义一个.
我不知道阻止这种情况的技术限制,但我认为他们会这样做是为了防止人们自己开枪.
string imp = new C(); // = "implicit"
string exp = (string)new C(); // = "explicit"
Run Code Online (Sandbox Code Playgroud)
这会让我感到疯狂,没有任何意义,C只应该以一种方式投射到一个字符串,而不是两种不同的方式.
| 归档时间: |
|
| 查看次数: |
6690 次 |
| 最近记录: |