簡體   English   中英

為什么我收到此Resharper警告-不覆蓋'Object.Equals(object o)和'Object.GetHashcode()'

[英]Why I am getting this Resharper warning - does not override 'Object.Equals(object o) and 'Object.GetHashcode()'

我有以下課程:

public class CalculateToValue
{
    public CalculateToValue(string normalValue)
    {
        NormalValue = normalValue;
    }

    public string NormalValue { get; private set; }

    public bool Equals(string other)
    {
        return NormalValue.Equals(other);
    }

    public bool Equals(CalculateToMax other)
    {
        return NormalValue.Equals(Enum.GetName(typeof(CalculateToMax),
    other));
    }

    public static bool operator ==(CalculateToValue a, CalculateToMax b)
    {
        if (((object) a == null) || ((object) b == null))
        {
            return false;
        }

        return a.Equals(b);
    }

    public static bool operator !=(CalculateToValue a, CalculateToMax b)
    {
        return !(a == b);
    }
  }

一切正常。 但這顯示了對類的警告。 它說 -

計算值定義運算符==或運算符!=但不覆蓋Object.Equals(object o)Object.GetHashcode()

如果我通過resharper生成代碼,則警告會得到解決。

   protected bool Equals(CalculateToValue other)
    {
        return string.Equals(NormalValue, other.NormalValue);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((CalculateToValue) obj);
    }

現在,由於該類是舊類,所以我不確定上面的reshaper生成的代碼是否還可以。

有人可以解釋一下我為什么收到此警告嗎?

有人可以解釋一下我為什么收到此警告嗎?

考慮:

CalculateToValue ctv = whatever;
CalculateToMax ctm = whatever;
bool b1 = ctv.Equals(ctm);
bool b2 = ctv == ctm;
bool b3 = ctv.Equals((object)ctm);

您期望b1,b2和b3具有相同的值還是不同的值?

您的原始代碼會得到什么結果?

您提出的修復程序會得到什么結果?

您現在是否認為您建議的修復程序是錯誤的? (你應該。)

在查看此代碼時:您是否注意到==的實現存在任何嚴重錯誤? 它說兩個空值彼此不相等; 那正確嗎? 對我來說似乎不對。

為什么Resharper希望您覆蓋Equals

您的類的使用者可能會認為Equals==在語義上是相同的,但是C#語言不會強制這樣做。

Resharper的擬議實施是否可以接受?

如果您使用Resharper的代碼,則Equals==在語義上將不相同,因為您現有的代碼允許CalculateToValue實例等於CalculateToMax實例,而Resharper的代碼則不同。

我該如何解決?

  1. 編寫確切說明應該發生的情況的規范。 目的是讓您真正知道您的代碼打算做什么。 例如,規范應解釋在什么情況下CalculateToMax的實例可以等於CalculateToValue的實例?
  2. 為您的每個規范編寫測試用例。 埃里克(Eric)的回答提供了一個很好的起點。
  3. 編寫您的代碼。

有關如何執行這些步驟的示例,我建議閱讀Eric Lippert的Integer部門,該部門對本文進行匯總

我還需要做什么?

考慮加強IEquatable

我為什么還要知道。

此類的消費者可能會認為Equals / ==是反身(A == A),可交換(A == B≡B == A)和可傳遞(A == B && B == C意味着A == C)。 無需過多計划,您的實現可能是自反的和可傳遞的,但是由於CalculateToMax是枚舉,因此使實現實現可交換性實際上是不可能的。

通常,可以通過遵循簡單的模板並將對原語上的相等操作的調用鏈接在一起來簡化相等的實現。 Resharper很高興自動生成此類代碼。 不幸的是,在您的情況下,您正在將類與枚舉進行比較……這確實很奇怪。

有沒有辦法使這更容易?

完全采用另一種方法。 我建議不要使用相等運算符將枚舉與類進行比較。

根據Microsoft的准則,當重載運算符"==" ,還應該重寫EqualsGetHashcode

在此處檢查准則: https : //msdn.microsoft.com/zh-cn/library/7h9bszxx(v=vs.100).aspx

檢查有關實施Equals總體建議: https : Equals ( v= Equals

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM