e.g.
public readonly record struct Potential
{
private AppliedPotential(double valueInVolt)
{
_internalValue = valueInVolt;
}
public static AppliedPotential FromVolt(double valueInVolt) => new(valueInVolt);
public double InVolt => _internalValue;
//[...more implementation like operator overloads...]
private readonly double _internalValue;
}
< /code>
Поскольку мы хотим выполнять вычисления с этими, мы хотим иметь перегрузки оператора. Но для всех этих типов они имеют одинаковую реализацию: < /p>
Код: Выделить всё
public static [Type] operator +([Type] left, [Type] right) => new(left._internalValue + right._internalValue);
public static [Type] operator -([Type] left, [Type] right) => new(left._internalValue - right._internalValue);
public static [Type] operator *([Type] value, double factor) => new(value._internalValue * factor);
public static double operator /([Type] left, [Type] right) => left._internalValue / right._internalValue;
public static bool operator >([Type] left, [Type] right) => left._internalValue > right._internalValue;
public static bool operator >=([Type] left, [Type] right) => left._internalValue >= right._internalValue;
public static bool operator left._internalValue < right._internalValue;
public static bool operator left._internalValue _internalValue.CompareTo(other._internalValue);
// etc etc
< /code>
Более 30 типов, которые много дублированного кода и не очень сухой! Я не могу использовать исходные генераторы, поскольку мы обнаружили, что их трудно поддерживать, и решил, что мы больше не делаем их сами. В C ++ я бы использовал шаблоны, но у C# нет их. И общие классы - это нечто другое. Но большая проблема заключается в том, что структура
Код: Выделить всё
public interface IStrongDouble
where TSelf : IStrongDouble
{
double Value { get; }
static abstract TSelf Create(double value);
public static TSelf operator +(TSelf left, TSelf right) =>
TSelf.Create(left.Value + right.Value);
}
< /code>
Но это не компилируется, давая ошибку CS0563: < /p>
Одним из параметров двоичного оператора должен быть содержащий тип < /p>
< /blockquote>
Я пытался поднять его, но не достиг ... p> . Я пытался реализовать перегрузку оператора, такую как < /p>
public static TSelf operator +(IStrongDoubleNumber left, IStrongDoubleNumber right) =>
TSelf.Create(left.Value + right.Value);
< /code>
, которая не дает ошибки ... однако перегрузка оператора не обнаружена при добавлении значений. Например,
var result = Potential.FromVolt(1) + Potential.FromVolt(2);< /code>
даст «оператор» + »не может быть применен к операндам типа« потенциал »и« потенциал ». Для этой попытки: эта попытка не является моим вопросом, мой вопрос выше) < /p>
Я пытался обойти это, внедрив неявный актерский оператор
public static implicit operator IStrongDoubleNumber([Type] source) => source;< /code>.
Но это дает новую ошибку «Пользовательские преобразования в интерфейс или из интерфейса не допускаются» ...
(почему C# делает мою жизнь такой тяжелой!) Один такой тип, с общим параметром, а затем объявляет некоторые «фиктивные» типы для каждого вида значения? например Измерение
< /blockquote>
, который не будет работать: < /p>
Во -первых, типы имеют конкретный способ, который они создают и читают: например, Создайте потенциал var polily.fromvolt (value) и чтение двойного потенциала involt = polive.involt; . Они различаются на тип. Например.
Код: Выделить всё
public static Duration operator /(Current left, CurrentRate right) =>
Duration.FromSeconds(left._internalValue / right._internalValue);
Подробнее здесь: https://stackoverflow.com/questions/796 ... mentations