5

同じクラスで同じ型の2つの演算子(明示的および暗黙的)を共存できないのはなぜですか?私が次のものを持っているとしましょう:

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

}

したがって、次の2つの方法のいずれかを使用する可能性をクライアントに与えることができます。

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

これが許可されない特別な理由はありますか、それともプログラマーの誤用を避けるための単なる慣習ですか?

4

2 に答える 2

17

暗黙的および明示的演算子のオーバーロードページによると:

そのとおりです。暗黙的な演算子を定義すると、明示的な変換も可能になります。明示的な演算子を定義すると、明示的な変換のみが可能になります。

したがって、明示的な演算子を定義すると、次のことができます。

Thing thing = (Thing)"value";

暗黙の演算子を定義する場合でも、上記を実行できますが、暗黙の変換を利用することもできます。

Thing thing = "value";

つまり、明示的には明示的な変換のみが許可され、暗黙的には明示と暗黙の両方が許可されます...したがって、定義できるのは1つだけです。

于 2012-06-05T05:59:45.380 に答える
2

それが許可されていない理由は、それが無意味だからです。明示的にはキャストを強制し、暗黙的にはキャストを忘れることができますが、それでもキャストすることができます。ImplicitはExplicitの機能を拡張します。だからあなたの明示的な演算子をコメントアウトして微笑んでください:)

于 2012-06-05T06:05:08.260 に答える