IEquatable<T> and [AllowNull]

13

我刚刚将Visual Studio更新到最新的16.6.0 Preview 1.0版本,并使用了最新的.NET Core 3.1.2。我的项目已经启用了<Nullable>enable</Nullable>

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

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

因此,我实现了 IEquatable<T> 接口的任何类都会显示警告:CS8767: Nullability of reference types in type of parameter 'o' of 'bool MyType.Equals(MyType o)' doesn't match implicitly implemented member 'bool IEquatable.Equals(MyType other)' because of nullability attributes.。
最好的解决方法是什么?
我可以添加一个可空操作符 bool Equals(T? o),或者我可以添加 [AllowNull](引用 System.Diagnostics.CodeAnalysis)。两种方法似乎都能消除警告,但我不确定哪种更好。
另外,我现在打开了一个我并不想要的 null 参数。

1
我意识到,空值检查和泛型仍然是一项艰苦的工作... - Mario Vernari
2
相关 https://github.com/dotnet/roslyn/issues/41937 - Thariq Nugrohotomo
1
'bug'?'fixed'?你有相关文献吗? - kofifus
3
给你的 Equals 方法添加 [AllowNull] - Julien Couvreur
1
你能分享整个代码示例吗?使用你的类型实现 IEquatable<T> - Pavel Anikhouski
显示剩余2条评论
1个回答

9
< p > 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=


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接