internal static class ChoosingEqOperTest
{
class A
{
public static bool operator ==(A a, A a2) => false;
}
class B:A
{
public static bool operator ==(B a, B a2) => true;
}
static void CheckChosenOper<T>(T x, T x2) where T : A
{
Console.WriteLine(x==x2);
}
internal static void Do()
{
var a = new A();
var a2 = new A();
var b = new B();
var b2 = new B();
CheckChosenOper(a,a2); // 1. "False"
CheckChosenOper(b,b2); // 2. "False" !?
CheckChosenOper<A>(a,a2); // 3. "False"
CheckChosenOper<A>(b, b2); // 4. "False"
//CheckChosenOper<B>(a, a2); //Complie Error
CheckChosenOper<B>(b, b2); // 5. "False" !?
Console.WriteLine(a == a2); // 6. "False"
Console.WriteLine(b == b2); // 7. "True"
Console.WriteLine(a == b2); // 8. "False"
Console.WriteLine(b == a2); // 9. "False"
}
}
一些问题:
A) 为什么#2 & #5 打印“False”?B
- 我希望在这些情况下应该从类中获取运算符实现。
B) 我是对的:由于 #8 和 #9 都打印“False” - Cosen 运算符实现是第一个发现的,两种事实参数类型都可以转换为它的参数类型?
c) 选择运算符 == 实现的常见规则是什么?