3

Я хочу определить тип Nibble.Есть ли способ генерировать ошибку компилятора?

Я хочу, чтобы, если пользователь устанавливает значение выше 0xf, он должен генерировать ошибку компилятора.

Возможно ли это?

+1

Было бы очень полезно, если бы вы могли указать соответствующий компилятор. –

+1

Я генерирую ошибки компилятора все время! :( –

ответ

0

Нет, это невозможно с помощью компилятора C#.

У этого нет препроцессора для проверки постоянных значений, таких как препроцессор C/C++.

Лучшее, что вы можете сделать, это выбросить исключение во время выполнения.

Редактировать: Вы всегда можете попробовать запустить код C# (с некоторыми незначительными изменениями) через препроцессор C/C++ и испустить директиву #error.

Edit:

Видя это зависит от языка, да, вы можете легко сделать это в любой LANGAUGE, который поддерживает какой-то макроподстановкам или компилировать оценки времени. Например: Схема, LISP, C/C++ и т.д.

1

Если в вашей точке USER является DEVELOPER вы можете сделать это с помощью макроса, как это:

#if YOUT_VALUE == 0xf 
    #error YOUR_ERROR_MESSAGE 
#endif 

Но в каком-то развитии Enviroment вы можете иметь проблемы с сравнение в заявке #if, потому что ее функциональность была разрезана только на defied/undefined.

+0

C# приятель, а не C/C++. – leppie

+1

@leppie: от чего вы это знаете? – Svisstack

+0

теги сообщения; P oops, я видел, что он говорит .NET, предположил, что это C#. Удалил мой голос. – leppie

0

Вы можете использовать Enum с атрибутом [Flags]. Таким образом, вы имеете право использовать битовые операции на своих членов:

[Flags] 
enum Nibble 
{ 
_0, 
_1, 
// ... 
_A, 
_F, 
}; 

byte b = Nibble._1|Nibble._A; 

Вы также можете создать STRUCT клев с неявным оператором преобразования из междунар грызть. Но это создало бы ошибку времени выполнения, а не ошибку времени компиляции.

Если вы хотите сделать статическую проверку, посмотрите на API контрактов C# 4.0.

+1

К сожалению: 'Nibble oops = (Nibble) 255;' KABOOM! – leppie

+0

Ничего не получается :) – codymanix

+2

Атрибут flags не позволяет выполнять побитовые операции, что делает базовый тип. Атрибут используется для форматирования битовых флагов соответствующим образом при печати. –

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 различные типы целочисленной фиксированной ширины фактически не встроены в язык, они определяются пользователем. Таким образом, нет причин, по которым вы не сможете построить свой собственный определяемый пользователем фиксированный тип целочисленной ширины.

Смежные вопросы