Я использую класс в качестве оболочки для размещения группы из нескольких неподписанных шорт, которые представляют разные варианты или характеристики. Каждый короткий инициализируется как сила двух, поэтому я могу легко добавить или или их вместе.Перегрузка оператора для примитивных типов
public static class Options
{
public static readonly ushort OPTN0 = 1 << 0; // 0001
public static readonly ushort OPTN1 = 1 << 1; // 0010
public static readonly ushort OPTN2 = 1 << 2; // 0100
...
}
public static void main(string[] args)
{
funcThatUsesOptns(Option.OPTN0); // works fine
funcThatUsesOptns(Option.OPTN1 | Option.OPTN2); // fails because '|' returns int
funcThatUsesOptns((ushort)(Option.OPTN0 | Option.OPTN2)); // works fine
...
}
Однако, поскольку «+» и «|» оба возвращают ints в этой ситуации, я должен бросать их каждый раз, когда я это делаю. Например, как а и Ь инициализируется как Интс:
var a = Option.OPTN0 + Option.OPTN1;
var b = Option.OPTN0 | Option.OPTN1;
Так мне было интересно, если перегрузка оператора было возможно для примитивных типов. Если нет, есть ли лучшие способы достижения этого? Конечно, я не собираюсь убивать меня, чтобы просто бросать его каждый раз, но я надеялся на более чистый путь.
Редактировать: Я использую это, чтобы отображать множество простых геометрических объектов (кубы, пирамиды, ...). Я хотел бы иметь возможность быстро сказать рендереру, который стоит рисовать. Если лицо на одном объекте касается другого или обращено от камеры, я могу установить соответствующий бит, чтобы сообщить визуализатору не рисовать это лицо.
Почему бы не определить свои «параметры» как 'int' и изменить' funcThatUsesOptns', чтобы взять 'int'? – juharr
По какой причине вы не используете Enums с атрибутом 'Flags'? –
Я пробовал использовать флаги, но если я делал это неправильно (очень вероятно), мне все еще нужно было отличать – Camander