gpt4 book ai didi

c# - 运算符 == 是如何选择的?

转载 作者:行者123 更新时间:2023-12-03 23:05:57 25 4
gpt4 key购买 nike

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 打印“假”? - 我希望运算符实现应该取自 B在这些情况下类。
B)我是对的:因为 #8 和 #9 都打印“False” - Cosen 运算符实现是第一个发现的,两个事实参数类型都可以转换为它的参数类型?
c) 选择运算符 == 实现的常见规则是什么?

最佳答案

A) 嗯,你的方法 CheckChosenOper是一个泛型方法,它仍然“使用”类 A 作为基类,它是自己的 ==运算符,即使您有意指定 <B>类型。派生类中似乎没有覆盖运算符,并且 CheckChosenOper方法只能使用它已知的东西:A 类。它不能独立运行并使用反射来搜索其他有效的相等运算符。
B) 不,你错了。在#8 和#9 情况下,编译器有两个选择 - 向上转换 A 到 B 并将 B1 与 B2 进行比较,将 B 向下转换为 A 并将 A1 与 A2 进行比较。由于向上转换是禁忌并且必须通过转换运算符专门完成,因此编译器采用简单的 A1==A2 选择。
C) 好吧,如果我写的是 struct ,我肯定会去一个。随着!= , GetHashCode , IEquatable<> ,以及其他一些东西。但是必须有很好的理由来创建自己的结构,因为它们的行为不同。

关于c# - 运算符 == 是如何选择的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62714099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com