Код: Выделить всё
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));
}
}
Код: Выделить всё
Error CS0019: Operator '==' cannot be applied to operands of type 'TState' and 'TState'
Поскольку эти конечные автоматы длинные -живых объектов, любое количество статически предварительно загруженных операций/заголовков приветствуется, если они позволяют упростить написание и улучшить читаемость потребляющего кода.
Я подумал о кэшировании значения перечисления как 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
Подробнее здесь: https://stackoverflow.com/questions/792 ... parameters