有没有办法生成编译器错误?

时间:2010-07-22 11:25:58

标签: .net language-agnostic visual-studio-2010 compiler-errors

我想定义一个Nibble类型。

我希望如果用户将值设置为高于0xf,则应该生成编译器错误。

这可能吗?

4 个答案:

答案 0 :(得分:1)

如果您的USERDEVELOPER,那么您可以使用宏来执行此操作:

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

但是在某些开发环境中,你可能会在#if语句中遇到比较问题,因为她的功能仅限于defied / undefined。

答案 1 :(得分:0)

不,使用C#编译器是不可能的。

它没有预处理器来测试像C / C ++预处理器那样的常量值。

最好的办法是在运行时抛出异常。

编辑:你总是可以通过C / C ++预处理器尝试运行C#代码(有一些小的改动)并发出#error指令。

修改

看到这是与语言无关的,是的,您可以在任何支持某种宏扩展或编译时评估的语言中轻松完成。例如:Scheme,LISP,C / C ++等

答案 2 :(得分:0)

您可以使用带有[Flags]属性的Enum。这样就可以对其成员使用按位运算:

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

byte b = Nibble._1|Nibble._A;

您还可以使用从int到半字节的隐式转换运算符创建结构半字节。但这会产生运行时错误,而不是编译时错误。

如果您想进行静态检查,请查看c#4.0 Contracts API。

答案 3 :(得分:0)

看起来实现您想要的最简单的方法是子范围类型。支持子范围类型的语言几乎是Algol68连续系列中的所有语言(Algol68,Pascal,Modula-2,Oberon,Component Pascal)及其外壳和衍生物(Turbo Pascal,Borland Pascal,FreePascal,Delphi,Kylix,Object Pascal) )以及阿达。我相信你可以使用一些沉重的模板fu在C ++中实现子范式。您可以使用具有更具表现力的类型系统的语言来实现它们,例如Scala,Haskell,ML,Agda,Epigram,Guru。

我不知道为什么更多语言不支持子范围类型。它们显然很有用,易于使用,易于理解,易于实现。

另一种可能性可能是Fortress。在Fortress中,各种固定宽度的整数类型实际上并未构建在语言中,它们是用户定义的。因此,您没有理由不能构建您自己的用户定义的固定宽度整数类型。