【发布时间】:2023-10-29 10:45:01
【问题描述】:
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) 选择 operator == 实现的常用规则是什么?
【问题讨论】:
-
使用通用约束
where T : A,该函数将使用A中的运算符。如果你改变它where T : BCheckChosenOper(b, b2);将打印true
标签: c# .net generics operator-keyword equality-operator