重新实现Enum.HasFlag用于Mono 2.6

时间:2014-06-18 06:36:05

标签: c#

我试图将Jint转换为在Mono 2.6中使用。不幸的是,Mono 2.6没有Enum.HasFlag和他们在Jint中使用的东西。我还要补充一点,我对C#很新。

根据MSDN页面(http://msdn.microsoft.com/en-us/library/system.enum.hasflag(v=vs.110).aspx),实现应该是

thisInstance And flag = flag

但这似乎没有多大意义。如果这些都是按位操作不应该更像这样吗?

thisInstance & flag == flag

因此,我尝试修改的行是

Writable = !fieldInfo.Attributes.HasFlag(FieldAttributes.InitOnly);

我已将此问题隐藏在

var thisInstance = fieldInfo.Attributes;
var thisFlag = FieldAttributes.InitOnly;
var hasFlag1 = thisInstance & thisFlag == thisFlag;
var hasFlag2 = thisInstance And thisFlag = thisFlag;
Writable1 = !hasFlag1;
Writable2 = !hasFlag2;

并且可以理解的是编译器并不喜欢这些中的任何一个。对于hasFlag1,我得到了

Operator '&' cannot be applied to operands of type 'System.Reflection.FieldAttributes' and 'bool'

对于hasFlag2:

Unexpected symbol 'And'

只是想知道是否有人知道这是怎么做的。

谢谢!

1 个答案:

答案 0 :(得分:1)

似乎基于编译器的错误,==优先于&amp ;. 因此,您的行评估如下:     var hasFlag1 = thisInstance& (thisFlag == thisFlag);

你想要的是这个:

var hasFlag1 = (thisInstance & thisFlag) == thisFlag;

因此,如果添加括号,编译器错误应该消失。

很可能And是VB等效于&