Я хочу определить тип Nibble.Есть ли способ генерировать ошибку компилятора?
Я хочу, чтобы, если пользователь устанавливает значение выше 0xf
, он должен генерировать ошибку компилятора.
Возможно ли это?
Я хочу определить тип Nibble.Есть ли способ генерировать ошибку компилятора?
Я хочу, чтобы, если пользователь устанавливает значение выше 0xf
, он должен генерировать ошибку компилятора.
Возможно ли это?
Нет, это невозможно с помощью компилятора C#.
У этого нет препроцессора для проверки постоянных значений, таких как препроцессор C/C++.
Лучшее, что вы можете сделать, это выбросить исключение во время выполнения.
Редактировать: Вы всегда можете попробовать запустить код C# (с некоторыми незначительными изменениями) через препроцессор C/C++ и испустить директиву #error
.
Edit:
Видя это зависит от языка, да, вы можете легко сделать это в любой LANGAUGE, который поддерживает какой-то макроподстановкам или компилировать оценки времени. Например: Схема, LISP, C/C++ и т.д.
Если в вашей точке USER
является DEVELOPER
вы можете сделать это с помощью макроса, как это:
#if YOUT_VALUE == 0xf
#error YOUR_ERROR_MESSAGE
#endif
Но в каком-то развитии Enviroment вы можете иметь проблемы с сравнение в заявке #if
, потому что ее функциональность была разрезана только на defied/undefined.
Вы можете использовать Enum с атрибутом [Flags]. Таким образом, вы имеете право использовать битовые операции на своих членов:
[Flags]
enum Nibble
{
_0,
_1,
// ...
_A,
_F,
};
byte b = Nibble._1|Nibble._A;
Вы также можете создать STRUCT клев с неявным оператором преобразования из междунар грызть. Но это создало бы ошибку времени выполнения, а не ошибку времени компиляции.
Если вы хотите сделать статическую проверку, посмотрите на API контрактов C# 4.0.
Похоже, что самый простой способ достичь желаемого - это тип поддиапазона. Языки, поддерживающие типы поддиапазонов, в значительной степени соответствуют всем языкам в последовательности Algol68 (Algol68, Pascal, Modula-2, Oberon, Component Pascal) и их кузенам и производным (Turbo Pascal, Borland Pascal, FreePascal, Delphi, Kylix, Object Pascal), а также Ада. Я считаю, что вы можете реализовать типы поддиапазонов в C++, используя тяжелый шаблон-fu. Вероятно, вы можете реализовать их на языках с более выразительными типами систем, таких как Scala, Haskell, ML, Agda, Epigram, Guru.
Я понятия не имею, почему не все языки поддерживают типы поддиапазонов. Они, очевидно, полезны, просты в использовании, понятны и просты в применении.
Другая возможность может быть крепостью. В Fortress различные типы целочисленной фиксированной ширины фактически не встроены в язык, они определяются пользователем. Таким образом, нет причин, по которым вы не сможете построить свой собственный определяемый пользователем фиксированный тип целочисленной ширины.
Было бы очень полезно, если бы вы могли указать соответствующий компилятор. –
Я генерирую ошибки компилятора все время! :( –