Более простой inumber <> с реализацией по умолчанию [дублировать]C#

Место общения программистов C#
Ответить
Anonymous
 Более простой inumber <> с реализацией по умолчанию [дублировать]

Сообщение Anonymous »

Я реализовал «названные внутренние типы» (то есть такие вещи, как текущий , потенциальный , которые мы можем пройти, вместо того, чтобы все было двойным . Да, я знаю, что есть пакеты, которые уже сделали это: я не хочу их, я делаю это сам). CASE-CASE. < /p>
Итак, я сделал свою собственную замену 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);
}
Этот вопрос о возможностях языка/компилятора C#: определение арифметического оператора в (общем) интерфейсе
Статический анализ и компилятор не имеют никаких проблем с этим вообще! Нет ошибок, нет предупреждений.

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

var value3 = value1 + value2;
). Ссылка
В этот момент компилятор говорит, что < /p>

Оператор '+' не может быть применен к операнду типа «mytype» и «mtype». Он имеет то же самое определение iadditionoperators , так что оно должно работать? Похоже, что такая отхода должна поддерживать все эти дубликаты реализации всех числовых операторов. Совсем не сухо! < /P>
Изменить: я пропустил шаг или два.

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

static TSelf operator +(TSelf left, TSelf right) => TSelf.Create(left.Value + right.Value);
, но это дало мне ошибку CS0563. А потом я попал в кроличье дыру, пытаясь это обойти это, но я никогда не понял, как ...

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

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

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

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

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

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