Итак, я сделал свою собственную замену isstrongdoublenumber < /code> < /p>
Теперь, с простой реализацией.
Код: Выделить всё
using System.Numerics;
public class Program
{
public static void Main()
{
var value1 = new MyType(1);
var value2 = new MyType(3);
var value3 = value1 + value2;
}
public interface IStrongDouble
where TSelf : struct
{
double Value { get; }
static abstract TSelf Create(double value);
}
public interface IStrongDoubleNumber
: IStrongDouble,
IAdditionOperators
where TSelf : struct, IStrongDoubleNumber
{
}
public readonly record struct MyType(double Value) : IStrongDoubleNumber
{
public static MyType Create(double value) => new(value);
public static MyType operator +(MyType left, MyType right) =>
Create(left.Value + right.Value);
}
}
< /code>
Тем не менее, я заметил, что мне нужно повторно поднять те же численные интерфейсы для каждого сильного типа, в то время как они на самом деле имеют одинаковую реализацию! Было бы здорово использовать по умолчанию. Поэтому я попробовал реализацию по умолчанию: < /p>
public interface IStrongDouble
where TSelf : struct
{
double Value { get; }
static abstract TSelf Create(double value);
}
public interface IStrongDoubleNumber
: IStrongDouble,
IAdditionOperators
where TSelf : struct, IStrongDoubleNumber
{
static TSelf IAdditionOperators.operator +(TSelf left, TSelf right) =>
TSelf.Create(left.Value + right.Value);
}
public readonly record struct MyType(double Value) : IStrongDoubleNumber
{
public static MyType Create(double value) => new(value);
}
Статический анализ и компилятор не имеют никаких проблем с этим вообще! Нет ошибок, нет предупреждений.
Код: Выделить всё
var value3 = value1 + value2;В этот момент компилятор говорит, что < /p>
Оператор '+' не может быть применен к операнду типа «mytype» и «mtype». Он имеет то же самое определение iadditionoperators , так что оно должно работать? Похоже, что такая отхода должна поддерживать все эти дубликаты реализации всех числовых операторов. Совсем не сухо! < /P>
Изменить: я пропустил шаг или два.
Код: Выделить всё
static TSelf operator +(TSelf left, TSelf right) => TSelf.Create(left.Value + right.Value);Подробнее здесь: https://stackoverflow.com/questions/796 ... ementation
Мобильная версия