CA1066: Equals'ı geçersiz kılarken IEquatable'ı uygulayın

Özellik Değer
Kural Kimliği CA1066
Başlık Equals’ı geçersiz kılarken IEquatable uygulayın
Kategori Tasarım
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Bir değer türü (yapı) yöntemini geçersiz kılar Equals , ancak uygulamaz IEquatable<T>.

Kural açıklaması

Değer türü Equals yöntemini geçersiz kılıyorsa, bu türün iki örneğinin değer eşitliği açısından karşılaştırılmasını desteklediğini gösterir. Eşitlik için kesin tipte testleri desteklemek amacıyla IEquatable<T> arabirimini uygulamayı göz önünde bulundurun. Bu, eşitlik kontrolleri yapan çağrıcıların güçlü türdeş System.IEquatable<T>.Equals metodunu çağırmaları ve argümanı kutulama işlemini önleyerek performansın geliştirilmesini sağlar. Daha fazla bilgi için bkz . Uygulayıcılara notlar.

Uygulamanız System.IEquatable<T>.Equals ile Equalstutarlı sonuçlar döndürmelidir.

İhlalleri düzeltme

Bir ihlali düzeltmek için, IEquatable<T> uygulayın ve bu uygulanan yöntemi çağırmak için Equals geçersiz kılmasının güncellemesini yapın. Örneğin, aşağıdaki iki kod parçacığı kuralın ihlalini ve nasıl düzeltileceğini gösterir:

public struct S
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public override int GetHashCode()
        => _value.GetHashCode();

    public override bool Equals(object other)
        => other is S otherS && _value == otherS._value;
}
using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public override int GetHashCode()
        => _value.GetHashCode();

    public override bool Equals(object other)
        => other is S otherS && Equals(otherS);

    public bool Equals(S other)
        => _value == other._value;
}

Uyarıların ne zaman bastırılması gerekiyor?

Arayüzün uygulanmasından elde edilen tasarım ve performans avantajları kritik değilse, bu kurala ait ihlalleri bastırmak güvenlidir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Ayrıca bkz.