为什么不能共存在C#中的相同类型的隐性和显性操作? [重复](Why can't coe

2019-09-17 18:26发布

这个问题已经在这里有一个答案:

  • 为什么我不能确定这两种隐性和显性运营商? 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;
    }

}

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

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

有,为什么这是不允许的,或只是一个约定,以避免程序员的误用什么特殊原因?

Answer 1:

据重载隐显运算符页面:

这是正确的。 定义一个隐含的运营商还允许显式转换。 定义一个明确的运营商只允许显式转换。

因此,如果你定义一个明确的操作,你可以做到以下几点:

Thing thing = (Thing)"value";

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

Thing thing = "value";

因此,在短期,明确只允许显式的转换,而隐允许两个显性和隐性...因此原因,你只能定义一个。



Answer 2:

这是不允许的原因是,它是没有意义的。 在明确迫使你投,隐含允许你对铸造忘记,但仍然可以让你施展。 隐扩展上的明确的功能。 所以注释掉您的明确运营商和微笑:)



文章来源: Why can't coexist implicit and explicit operator of the same type in C#? [duplicate]