Предотвратить реализации перегрузки дублирования оператораC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Предотвратить реализации перегрузки дублирования оператора

Сообщение Anonymous »

В нашей большой кодовой базе (приложение для обработки измерений) у нас были ошибки, где значения были смешаны, потому что все является двойным . Таким образом, мы решили попробовать твердо названные типы для таких вещей, как потенциал , потенциал , продолжительность и т. Д., Что приводит к ~ 30 типам
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# нет их. И общие классы - это нечто другое. Но большая проблема заключается в том, что структура 
даже не допускает наследство! (Опять же: C ++ позволяет это ... я переключился с C ++ на C# 5 лет назад, но я часто скучаю по нему ...) Я смотрел «Следующая лучшая вещь»: реализации по умолчанию на интерфейсах. Поэтому я сделал интерфейс istrongdouble , как это:

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

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# делает мою жизнь такой тяжелой!) Один такой тип, с общим параметром, а затем объявляет некоторые «фиктивные» типы для каждого вида значения? например Измерение  
, измерение и т. Д. - < /p>
< /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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Предотвратить реализации перегрузки дублирования оператора
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Предотвратить реализации перегрузки дублирования оператора
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Предотвратить реализации перегрузки дублирования оператора
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Предотвратить реализации перегрузки дублирования оператора
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Предотвратить реализации перегрузки дублирования оператора
    Anonymous » » в форуме C#
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous

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