接线员'!' 不能应用于x类型的操作数

Mo *_*tel 4 .net c# vb.net bitwise-operators operands

所以我在VB中有一些代码,我试图转换为C#.这段代码是由其他人编写的,我试图理解它,但有些困难.我有一些按位运算符和枚举比较,但不断抛出错误:

我不能说我之前使用了很多这些语法,并且对如何编写此代码感到困惑.我已经使用谷歌了解了它的更多信息,并且还使用了VB到C#在线转换器,希望得到一些基本的指导,但没有.下面的代码

VB - 这是有效的原始代码

Flags = Flags And Not MyEnum.Value ' Flags is of type int
Run Code Online (Sandbox Code Playgroud)

C# - 我转换的代码,它抛出一个错误

Flags = Flags & !MyEnum.Value; // Flags is of type int
Run Code Online (Sandbox Code Playgroud)

错误 - 每次返回的错误

接线员'!' 不能应用于MyEnum类型的操作数.

任何帮助和一些解释将非常感谢.

Swe*_*per 8

!只能在bool类型上操作.你似乎在操作一些位标志.在这种情况下,您应该使用按位NOT运算符~而不是逻辑NOT运算符!:

Flags = Flags & ~((int)MyEnum.Value); // you need to cast to int as well
Run Code Online (Sandbox Code Playgroud)


Dav*_*jas 6

要获得最佳转换,首先要了解VB为您执行的隐式转换是有帮助的:

Flags = Flags And Not (CInt(MyEnum.Value))
Run Code Online (Sandbox Code Playgroud)

这相当于C#代码:

Flags = Flags & ~(int)MyEnum.Value;
Run Code Online (Sandbox Code Playgroud)

哪个可以缩短:

Flags &= ~(int)MyEnum.Value;
Run Code Online (Sandbox Code Playgroud)

在VB中,"Not"既是逻辑运算符又是按位运算符,具体取决于上下文,但在C#中,您有两个不同的运算符.


AAA*_*ddd 5

您可能会混淆逻辑按位一元运算符

让我们访问帮助

运算符(C# 编程指南)

一元运算符

  • +x 身份
  • -x 否定
  • !x 逻辑否定
  • ~x 按位取反
  • ++x预增量
  • --x预减
  • (T)x 将 x 显式转换为类型 T

编译器错误CS0023

运算符“operator”不能应用于类型“type”的操作数

尝试将运算符应用于其类型不适用于该运算符的变量。