Должны ли операторы равенства быть реализованы в самом типе или допустимо реализовать их один раз с помощью операторов рC#

Место общения программистов C#
Ответить
Anonymous
 Должны ли операторы равенства быть реализованы в самом типе или допустимо реализовать их один раз с помощью операторов р

Сообщение Anonymous »

В C# 14 представлены члены расширения, включая операторы расширения, которые позволяют определять операторы в целом, а не повторять их для каждого типа.
Предположим, у меня есть интерфейс, представляющий подобные значениям объекты домена:

Код: Выделить всё

public interface IValue where TSelf : struct, IValue
{
static abstract bool Equals(TSelf left, TSelf right);
}
Вместо реализации == и != в каждой структуре, реализующей этот интерфейс, я централизую их с помощью блока расширения:

Код: Выделить всё

public static class ValueExtensions
{
extension(T) where T : struct, IValue
{
public static bool operator ==(T left, T right) => T.Equals(left, right);
public static bool operator !=(T left, T right) => !T.Equals(left, right);
}
}
Теперь любая подобная структура автоматически получает операторы равенства:

Код: Выделить всё

public readonly struct Distance : IValue
{
private readonly double meters;

public Distance(double meters) { this.meters = meters; }

public static bool Equals(Distance left, Distance right) =>
left.meters == right.meters;

public override bool Equals(object obj) =>
obj is Distance other && Equals(this, other)

}
Это работает правильно во время компиляции и во время выполнения, но инструменты (например, Rider и некоторые анализаторы Roslyn) по-прежнему предупреждают:

CA2231: реализуйте операторы равенства и сделайте их поведение идентичным поведению метода Equals

Поскольку операторы живут в блоке расширения, а не в самой структуре, считает инструмент в типе «отсутствуют» обязательные операторы.
Если операторы расширения технически корректны, является ли подавление проверки инструментов рекомендуемым подходом? Или типы по-прежнему должны содержать операторы тонкой пересылки, такие как:

Код: Выделить всё

public static bool operator ==(Distance left, Distance right) => Equals(left, right);
Мой вопрос
Считается ли хорошей практикой реализация операторов равенства типов значений в общих чертах с помощью блоков расширения C# 14, или типы значений по-прежнему должны объявлять свои собственные операторы == и !=, чтобы соответствовать инструментам и соглашениям?


Подробнее здесь: https://stackoverflow.com/questions/798 ... acceptable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»