Предположим, у меня есть интерфейс, представляющий подобные значениям объекты домена:
Код: Выделить всё
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)
}
CA2231: реализуйте операторы равенства и сделайте их поведение идентичным поведению метода Equals
Поскольку операторы живут в блоке расширения, а не в самой структуре, считает инструмент в типе «отсутствуют» обязательные операторы.
Если операторы расширения технически корректны, является ли подавление проверки инструментов рекомендуемым подходом? Или типы по-прежнему должны содержать операторы тонкой пересылки, такие как:
Код: Выделить всё
public static bool operator ==(Distance left, Distance right) => Equals(left, right);
Считается ли хорошей практикой реализация операторов равенства типов значений в общих чертах с помощью блоков расширения C# 14, или типы значений по-прежнему должны объявлять свои собственные операторы == и !=, чтобы соответствовать инструментам и соглашениям?
Подробнее здесь: https://stackoverflow.com/questions/798 ... acceptable
Мобильная версия