Обеспечение соблюдения ограничения сравнения в универсальных параметрах EnumC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Обеспечение соблюдения ограничения сравнения в универсальных параметрах Enum

Сообщение Anonymous »

Я попытался использовать ограничения сравнения для общих параметров Enum следующим образом:

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

public abstract class StateMachine {...}

public abstract class StateMachine:
StateMachine
where TState: struct, Enum
where TCommand: struct, Enum
{
public TState StateInitial { get; private set; }

protected StateMachine(TState stateInitial) => this.StateInitial = stateInitial;
}

public abstract class FiniteStateMachine:
StateMachine
where TState: struct, Enum
where TCommand: struct, Enum
{
protected FiniteStateMachine(TState stateInitial)
: base(stateInitial)
{
// Compiler Error CS0019:
// Operator '==' cannot be applied to operands of type 'TState' and 'TState'.
// Operator '==' cannot be applied to operands of type 'TCommand' and 'TCommand'.
var stateEquals = (default(TState) == default(TState));
var commandEquals = (default(TCommand) == default(TCommand));
}
}

public sealed class RouterFiniteStateMachine:
FiniteStateMachine
{
public enum EnumState { Unplugged, PluggedIn, }
public enum EnumCommand { None, PlugIn, UnPlug, }

public RouterFiniteStateMachine()
: base(EnumState.Unplugged)
{
var stateEquals = (default(EnumState) == default(EnumState));
var commandEquals = (default(EnumCommand) == default(EnumCommand));
}
}
Сравнение в конструкторе FiniteStateMachine не компилируется с помощью:

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

Error CS0019: Operator '==' cannot be applied to operands of type 'TState' and 'TState'
Я вроде понимаю «почему» и хотел бы знать, как можно элегантно обойти это. Базовые классы выполняют множество действий, требующих сравнения ==. Если я попытаюсь использовать ограничения IEquatable, IComparable для дженериков, то RouterFiniteStateMachine не будет компилироваться.
Поскольку эти конечные автоматы длинные -живых объектов, любое количество статически предварительно загруженных операций/заголовков приветствуется, если они позволяют упростить написание и улучшить читаемость потребляющего кода.
Я подумал о кэшировании значения перечисления как Int64, но они не будут обрабатывать UInt64 и наоборот.
Я заметил, что к этому времени (.NET 9 C# 13) встроенный -в целочисленных числовых типах теперь реализовано множество полезных интерфейсов, например:

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

public readonly struct Int64:
IComparable, IConvertible, ISpanFormattable, IFormattable, IComparable, IEquatable, IBinaryInteger, IBinaryNumber, IBitwiseOperators, INumber, IComparisonOperators, IEqualityOperators, IModulusOperators, INumberBase, IAdditionOperators, IAdditiveIdentity, IDecrementOperators, IDivisionOperators, IIncrementOperators, IMultiplicativeIdentity, IMultiplyOperators, ISpanParsable, IParsable, ISubtractionOperators, IUnaryPlusOperators, IUnaryNegationOperators, IShiftOperators, IMinMaxValue, ISignedNumber
Если не считать оператора ==, каковы мои лучшие варианты создания типобезопасных и производительных композиций на основе общих параметров TState TCommand? Возможно ли это вообще без бокса?

Подробнее здесь: https://stackoverflow.com/questions/792 ... parameters
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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