5

为什么不能在同一类中共存同一类型的两个运算符(显式和隐式)?假设我有以下内容:

public class Fahrenheit
{
    public float Degrees { get; set; }

    public Fahrenheit(float degrees) 
    {
        Degrees = degrees;
    }

    public static explicit operator Celsius(Fahrenheit f)
    {
        return new Celsius(ToCelsius(f.Degrees));
    }

    public static implicit operator Celsius(Fahrenheit f)
    {
        return new Celsius(ToCelsius(f.Degrees));
    }
}

public class Celsius {
    public float Degrees { get; set; }
    public Celsius(float degrees) 
    {
        Degrees = degrees;
    }

}

所以我可以给客户使用两种方式之一的可能性,例如:

Fahrenheit f = new Fahrenheit(20);
Celsius c1 = (Celsius)f;
Celsius c2 = f;

是否有任何特殊原因不允许这样做,或者这只是避免滥用程序员的约定?

4

2 回答 2

17

根据重载隐式和显式运算符页面:

这是正确的。定义隐式运算符还允许显式转换。定义显式运算符仅允许显式转换。

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

Thing thing = (Thing)"value";

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

Thing thing = "value";

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

于 2012-06-05T05:59:45.380 回答
2

The reason it's not allowed is that it's pointless. The Explicit forces you to cast, the implicit allows you to forget about casting, but still allows you to cast. Implicit extends on the functionality of Explicit. So comment out your Explicit operator and smile :)

于 2012-06-05T06:05:08.260 回答