我想定义一个Nibble类型。
我希望如果用户将值设置为高于0xf
,则应该生成编译器错误。
这可能吗?
答案 0 :(得分:1)
如果您的USER
是DEVELOPER
,那么您可以使用宏来执行此操作:
#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中,各种固定宽度的整数类型实际上并未构建在语言中,它们是用户定义的。因此,您没有理由不能构建您自己的用户定义的固定宽度整数类型。