运算符的显式和隐式(int)

时间:2016-04-04 19:18:25

标签: c# override implicit explicit

public static explicit operator int(Author a)
    {
        return a.Publications.Length;
    }
    public static implicit operator int(Author a)
    {
        return a.Publications.Length;
    }

为什么我不这样做?我的老师让我覆盖了Author类的operator int的隐式和显式转换。 +我可以得到深拷贝的解释:D?

2 个答案:

答案 0 :(得分:9)

  

为什么我不这样做?

你不能这样做,因为C#规范说你不能,在10.10.3节中。

  

[...]类或结构不能声明具有相同源和目标类型的隐式和显式转换运算符。

现在你可能会说:

  

回答一个“为什么”的问题,“因为这就是它在规范中所说的”,这是非常不满意的。

你问了一个模糊的问题。如果您想要更具体的答案,请提出更具体的问题。怎么样:

  

创建此规则时,C#设计团队可能考虑了哪些因素?

任何隐式转换都已经是合法的显式转换。也就是说,如果存在允许的隐式转换:

Shape s = whatever;
Fruit f = s;

然后

Fruit f = (Fruit)s;

也是合法的,必须意味着同样的事情。如果这两个语句具有不同的语义,那将是奇怪的,但在一个你可以声明相同转换的两个不同版本的世界中,一个是显式的,一个是隐式的,那么编译器必须检测这种情况并确保正确的转换是使用

转换逻辑,尤其是用户定义的转换逻辑,在C#中非常复杂。消除不必要的,令人困惑的并发症是一个好主意。

  

我可以获得深层复制的解释

不要在一个问题中提出两个问题。如果您有第二个问题,请发布第二个问题。

答案 1 :(得分:0)

我怀疑你看到编译器错误CS0557

仅供参考,如果您有隐式运算符,则也不需要显式运算符。隐含意味着没有必要进行直接演员。

显式:

Author a = new Author();
int i = (int)a;

隐式:

Author a = new Author();
int i = a;