web-dev-qa-db-ja.com

IEquatable <T>および[AllowNull]

Visual Studioを最新の.NET Core 3.1.2を含む最新の16.6.0 Preview 1.0に更新しました。私のプロジェクトには_<Nullable>enable</Nullable>_があります。

_IEquatable<T>_に変更があったようですが、現在_[AllowNull]_で定義されています:

_public interface IEquatable<T>
{
  bool Equals([AllowNull] T other);
}
_

その結果、bool Equals(T o)で_IEquatable<T>_を実装した私のクラスはすべて警告を表示します。

_CS8767_: 'bool MyType.Equals(MyType o)'のパラメーター 'o'の型の参照型のnull可能性は、null可能属性のため、暗黙的に実装されたメンバー 'bool IEquatable.Equals(MyType other)'と一致しません。

これを解決する最良の方法は何ですか?

Null可能な演算子bool Equals(T? o)を追加するか、_[AllowNull]_を追加できます(_System.Diagnostics.CodeAnalysis_を参照して)。どちらも警告が消えるように見えますが、どちらが良いのかわかりません。

また、nullパラメータの扉を開けましたが、これは本当に必要ではありませんでした。

6
kofifus

IEquatable<T>.Equalsの規則は、引数をnullにすることができることです。 Tが参照型の場合は、?で注釈を付けるだけで、警告は表示されなくなります。次のコードは問題なくコンパイルされます。

#nullable enable

using System;

public class C1 : IEquatable<C1>
{
    public bool Equals(C1? c) => false;
}

public struct C2 : IEquatable<C2>
{
    public bool Equals(C2 c) => false;
}

https://sharplab.io/#v2:EYLgtghgzgLgpgJwD4GIB2BXANliwtwAEcaeBAsAFBUACATAIxW0DMh9hAwg4SIQJIBRAI4YIMMnAA83AHxUA3lUIr2bYAHsNWQiLFYoACm4B+QgGMAlIQC8swgDMIBuAG4qAX2aUabWAgxzGC46XgE9cUkZOnlKJUpVNUJNbV1RZyNOUKtbeycXd0ovSiA=

2
Drew Noakes