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
パラメータの扉を開けましたが、これは本当に必要ではありませんでした。
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;
}