IEquatable<T> 和 [AllowNull]

kof*_*fus 7 c# c#-8.0 nullable-reference-types

我刚刚使用最新的 .NET Core 3.1.2 将 Visual Studio 更新到最新的 16.6.0 Preview 1.0。我的项目有<Nullable>enable</Nullable>.

似乎发生了变化IEquatable<T>,现在定义为[AllowNull]

public interface IEquatable<T>
{
  bool Equals([AllowNull] T other);
}
Run Code Online (Sandbox Code Playgroud)

其结果是,任何类矿山其中实施的IEquatable<T>bool Equals(T o)现在显示一个警告:

CS8767:由于可空性属性,“bool MyType.Equals(MyType o)”的参数“o”类型中的引用类型的可空性与隐式实现的成员 'bool IEquatable.Equals(MyType other)' 不匹配。

解决这个问题的最佳方法是什么?

我可以添加一个可为空的 operator bool Equals(T? o),或者我可以添加[AllowNull](参考System.Diagnostics.CodeAnalysis)。两者似乎都使警告消失,但我不确定哪个更好。

此外,我现在为一个null我并不真正想要的参数打开了大门。

Dre*_*kes 9

约定IEquatable<T>.Equals是参数可以为空。如果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;
}
Run Code Online (Sandbox Code Playgroud)

https://sharplab.io/#v2:EYLgtghgzgLgpgJwD4GIB2BXANliwtwAEcaeBAsAFBUACATAIxW0DMh9hAwg4SIQJIBRAI4YIMMnAA83AHxUA3lUIr2bYAHsNWQiLFYoACm4B+QgGMAlIQC8swgDMIBuAG4qAX2aUabWAgxzGC46XgE 9cUkZOnlKJUpVNUJNbV1RZyNOUKtbeycXd0ovSiA=