gpt4 book ai didi

c# - 重载的运算符参数始终为 null

转载 作者:行者123 更新时间:2023-12-03 19:42:33 24 4
gpt4 key购买 nike

所以我有一个类,它重写 Equals(object obj) 和 GetHashCode() 并实现 IEquatable。为了在检查相等性时使使用这种类型更加自然,我想,哎呀,我会重载相等运算符和不等运算符,不用担心......

呃哦,担心...考虑以下内容 - 其中两个 myType 实例都不为 null:

if (myType != container.myType) //NullReferenceException
{
//never get here
}
//never get here either

现在,container 只是另一个类,用于保存 myType 的实例以及用于缓存项目的其他内容。

这是来自 myType 的实际(相关)代码:

public class MyType : IEquatable<MyType>
{
public static bool operator ==(MyType myTypeA, MyType myTypeB)
{
return myTypeA.Equals(myTypeB);
}

public static bool operator !=(MyType myTypeA, MyType myTypeB)
{
return !(myTypeA == myTypeB);
}

public override bool Equals(object obj)
{
if (obj != null && obj is MyType)
{
return Equals((MyType)obj);
}
return false;
}

public bool Equals(MyType other)
{
if (other != null)
{
return other.ToString() == ToString();
}
return false;
}
}

这方面有什么经验吗?

谢谢。

最佳答案

几个指针 -

  1. 如果您已重写类上的 ==!=,请确保使用 ReferenceEquals 检查重载实现中是否为 null而不是 ==,因为这会调用重载的运算符,然后进入循环或尝试在空 this 引用上调用 Equals,这可能就是这里发生的事情。
  2. 不要覆盖类上的 ==!=。这些运算符旨在实现值相等,而类并不是真正设计为具有值相等。删除运算符重载,或将 MyType 设为结构。

关于c# - 重载的运算符参数始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3850177/

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