将按位AND / NOT从VB.NET转换为C#

时间:2011-07-21 16:51:59

标签: c# vb.net c#-to-vb.net

原始代码(VB.NET):

curStyle = curStyle And (Not ES_NUMBER)

更改了代码(C#):

curStyle = curStyle & (!ES_NUMBER);

但它给了我这个错误:

  

运营商'!'不能应用于'long'类型的操作数

ES_NUMBER的数据类型为long。我尝试将其更改为int,string等。所有都不起作用。

如何解决这个问题?

4 个答案:

答案 0 :(得分:9)

And&相同;你说得对Not前面的Long是一个按位NOT运算符。 C#等价物是~

C#代码将是:

curStyle = curStyle & (­~ES_NUMBER);

查看 Bitwise operators in c# OR(|), XOR(^), AND(&), NOT(~) ,解释C#按位运算符。

答案 1 :(得分:2)

再一次,文件之旅证明了教学:

From MSDN

  

逻辑否定运算符(!)...是为bool定义的,当且仅当其操作数为false时才返回true。

文档中没有关于数值表达式的任何行为的任何内容,我希望这意味着操作符未被定义为完全使用这些表达式。

另一方面,MSDN has this to say about VB.NET's Not operator

  

对于数值表达式,Not运算符反转任何数值表达式的位值,并根据下表设置结果中的相应位...

现在的问题是:如何重现VB.NET的“不”用于C#的行为?值得庆幸的是,这并不难:您可以使用~ operator

curStyle = curStyle & (­~ES_NUMBER);

而且,好的衡量标准是documentation on &

  

对于积分类型,&计算其操作数的按位AND。

答案 2 :(得分:0)

单个&符通常是一个按位操作,但感叹号是一个逻辑操作。如果您需要逻辑AND:

,则需要使用two ampersands la C++
curStyle = curStyle && (!ES_NUMBER); 

如果你想要一个按位的AND,或者代字号:

curStyle = curStyle & (~ES_NUMBER);

答案 3 :(得分:0)

关键问题是(并且没有提供答案):curStyle是整数还是布尔?你是想获得一个真值(bool,是/否),还是你试图掩盖位域中的位?

对于前一种情况,curStyle是一个bool(真值),你说:

curStyle = curStyle && !ES_NUMBER ;

后一种情况,其中curStyle是一个整数类型,你想操纵它的位,需要:

curStyle = curStyle & ~Not ES_NUMBER ;