【问题标题】:Why can't coexist implicit and explicit operator of the same type in C#? [duplicate]为什么C#中不能共存相同类型的隐式和显式运算符? [复制]
【发布时间】:2012-06-05 05:54:15
【问题描述】:

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

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;

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

【问题讨论】:

  • 不允许编译吗?你得到什么错误?
  • @gideon: 重复的用户定义转换...
  • @gideon:在编译器时重复的用户定义转换;)

标签: c# operator-overloading implicit-conversion explicit-conversion


【解决方案1】:

根据Overloading Implicit and Explicit Operators页面:

没错。定义隐式运算符还允许 显式转换。定义显式运算符仅允许 显式转换。

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

Thing thing = (Thing)"value";

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

Thing thing = "value";

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

【讨论】:

  • 哇,你解释得很好。在阅读您的答案之前,我有点困惑。
【解决方案2】:

不允许这样做的原因是没有意义。显式强制你施放,隐式让你忘记施放,但仍然允许你施放。隐式扩展了显式的功能。所以注释掉你的显式运算符并微笑:)

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2010-09-18
    • 2012-04-25
    • 2013-08-14
    • 2012-06-06
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多