我刚刚使用最新的.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);
}

结果,任何使用IEquatable<T>实现bool Equals(T o)的我的类现在都显示警告:



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

我可以添加可为空的运算符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;
}

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

关于c# - IEquatable <T>和[AllowNull],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60750386/

10-13 07:09