IEquatable <T>и [AllowNull] - PullRequest
       43

IEquatable <T>и [AllowNull]

3 голосов
/ 19 марта 2020

Я только что обновил 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> с bool Equals(T o), теперь показывает предупреждение:

CS8767: Обнуляемость ссылочных типов в типе параметра 'o' из 'bool MyType.Equals (MyType o)' не соответствует неявно реализованному члену 'bool IEquatable.Equals (MyType other)' из-за атрибутов обнуляемости.

Как лучше всего решить эту проблему?

Я могу добавить обнуляемый оператор bool Equals(T? o) или добавить [AllowNull] (со ссылкой на System.Diagnostics.CodeAnalysis). Оба, кажется, предупреждают go, но я не уверен, какое из них лучше.

Кроме того, теперь я открыл дверь для параметра null, который мне не нужен.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Соглашение для IEquatable<T>.Equals состоит в том, что аргумент может быть нулевым. Если T является ссылочным типом, просто аннотируйте его с помощью ?, и предупреждение будет go удалено. Следующие компилируется нормально:

#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 =

0 голосов
/ 19 марта 2020

Добавьте это в ваш файл проекта между <PropertyGroup> s:

<PropertyGroup>
   <NoWarn>$(NoWarn);CS8767</NoWarn>
</PropertyGroup>
...