IEquatable<T> 和 [AllowNull]
Posted
技术标签:
【中文标题】IEquatable<T> 和 [AllowNull]【英文标题】:IEquatable<T> and [AllowNull] 【发布时间】:2020-06-30 04:29:36 【问题描述】:我刚刚使用最新的 .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);
因此,我使用 bool Equals(T o)
实现 IEquatable<T>
的任何类现在都会显示警告:
CS8767
: 'bool MyType.Equals(MyType o)' 的参数 'o' 类型中的引用类型的可空性与隐式实现的成员 'bool IEquatable.Equals(MyType other)' 不匹配,因为可空性属性.
解决这个问题的最佳方法是什么?
我可以添加一个可为空的运算符bool Equals(T? o)
,也可以添加[AllowNull]
(参考System.Diagnostics.CodeAnalysis
)。两者似乎都使警告消失了,但我不确定哪个更好。
另外,我现在打开了一个我并不真正想要的null
参数的大门。
【问题讨论】:
我意识到可空性检查和泛型仍然是一项艰难的生活...... 相关github.com/dotnet/roslyn/issues/41937 '错误'? '固定的' ?你有这方面的参考吗? 将[AllowNull]
添加到您的Equals
方法中
你能分享整个代码示例吗?随着你的类型实现IEquatable<T>
【参考方案1】:
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;
https://sharplab.io/#v2:EYLgtghgzgLgpgJwD4GIB2BXANliwtwAEcaeBAsAFBUACATAIxW0DMh9hAwg4SIQJIBRAI4YIMMnAA83AHxUA3lUIr2bYAHsNWQiLFYoACm4B+QgGMAlIQC8swgDMIBuAG4qAX2aUabWAgxzGC46XgE9cUkZOnlKJUpVNUJNbV1RZyNOUKtbeycXd0ovSiA=
【讨论】:
以上是关于IEquatable<T> 和 [AllowNull]的主要内容,如果未能解决你的问题,请参考以下文章
List<T>.Contains 和 T[].Contains 行为不同