【发布时间】:2014-10-07 03:21:59
【问题描述】:
我对泛型方法的运算符解析有疑问。
根据我对函数 EqualOperatorGeneric(下面的示例代码)中规范第 7.3.4 节的理解,应该找到类型 A 上 == 运算符的正确重载,但它似乎获得了 (object , 对象)。
我是不是在做一些非常明显的错误?有没有一种方法可以获得预期的行为,如果没有,我可以将给定的情况变成编译时或运行时错误吗?
public class A
{
public A(int num)
{
this.Value = num;
}
public int Value { get; private set; }
public override bool Equals(object obj)
{
var other = obj as A;
if (Object.ReferenceEquals(other, null))
return false;
return Object.Equals(this.Value, other.Value);
}
public override int GetHashCode()
{
return this.Value.GetHashCode();
}
public static bool operator ==(A l, A r)
{
if (Object.ReferenceEquals(l, null))
{
return !Object.ReferenceEquals(r, null);
}
return l.Equals(r);
}
public static bool operator !=(A l, A r)
{
return !(l == r);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(EqualOperatorGeneric(new A(1), new A(1)));
}
public static bool EqualOperatorGeneric<L, R>(L l, R r)
where L : class
where R : class
{
return l == r;
}
}
输出:
错误
【问题讨论】:
-
为了清楚起见,您可以轻松地删除至少一半的代码并仍然演示相关原理。
-
我个人喜欢 repros 有点冗长,但我可以删除其他平等检查。
标签: c# generics operator-overloading