【问题标题】:IEquatable<T> and [AllowNull]IEquatable<T> 和 [AllowNull]
【发布时间】:2020-06-30 04:29:36
【问题描述】:

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

似乎IEquatable&lt;T&gt; 发生了变化,现在它被定义为[AllowNull]

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

因此,我使用 bool Equals(T o) 实现 IEquatable&lt;T&gt; 的任何类现在都会显示警告:

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

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

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

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

【问题讨论】:

  • 我意识到可空性检查和泛型仍然是一项艰难的生活......
  • '错误'? '固定的' ?你有这方面的参考吗?
  • [AllowNull] 添加到您的Equals 方法中
  • 你能分享整个代码示例吗?随着你的类型实现IEquatable&lt;T&gt;

标签: c# c#-8.0 nullable-reference-types


【解决方案1】:

IEquatable&lt;T&gt;.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=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2011-09-11
    • 2023-01-31
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多