【问题标题】:Explicit and implicit for operator (int)运算符的显式和隐式 (int)
【发布时间】:2016-04-04 19:18:25
【问题描述】:
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?

【问题讨论】:

  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题不属于 Stack Overflow 的主题
  • 我建议你向你的老师寻求澄清,因为这个要求似乎是错误的。
  • 不要在一个问题中问两个问题。如果您有两个问题,请发布两个问题。

标签: c# overriding implicit explicit


【解决方案1】:

为什么我不能这样做?

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

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

现在你可能会说:

用“因为这就是规范中所说的”来回答“为什么”问题是非常不令人满意的。

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

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

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

Shape s = whatever;
Fruit f = s;

然后

Fruit f = (Fruit)s;

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

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

我能解释一下深拷贝吗

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

【讨论】:

    【解决方案2】:

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

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

    显式:

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

    隐式:

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

    【讨论】:

    • 你把它们倒过来了。 int i = (int)a; 是显式的,而不是隐式的。
    • 哎呀!我确实有我的例子,不是吗? :-) 谢谢先生。
    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 2014-03-18
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多