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?
答案 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;