【问题标题】:Operator '!' cannot be applied to operand of type x操作员 '!'不能应用于 x 类型的操作数
【发布时间】:2019-01-05 00:38:28
【问题描述】:

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

我不能说我以前使用过很多这样的语法,并且对如何编写这段代码感到困惑。我使用 Google 来了解更多信息,还使用 ​​VB 到 C# 在线转换器,希望获得一些基本指导,但一无所获。下面的代码

VB - 这是有效的原始代码

Flags = Flags And Not MyEnum.Value ' Flags is of type int

C# - 我转换的代码抛出错误

Flags = Flags & !MyEnum.Value; // Flags is of type int

错误 - 每次返回的错误

运算符“!”不能应用于 MyEnum' 类型的操作数。

我们将不胜感激任何帮助和一些解释。

【问题讨论】:

  • ! 不是位运算符,您的意思可能是~

标签: c# .net vb.net bitwise-operators operands


【解决方案1】:

! 只能对bool 类型进行操作。您似乎正在对一些位标志进行操作。在这种情况下,您应该使用按位非运算符~ 而不是逻辑非运算符!

Flags = Flags & ~((int)MyEnum.Value); // you need to cast to int as well

【讨论】:

  • 您需要将枚举值转换为 int。
  • @DaveDoknjas 你为什么这么说?我认为这不是真的,因为枚举的基础类型是 int,因此 ~ 运算符无需强制转换就可以正常工作。
  • @KirkWoll:位运算符 '&' 没有为 int 和任何枚举定义(这是您将得到的实际错误),因此您需要强制转换。
  • @DaveDoknjas 不确定您在说什么。这工作得很好:var foo = Foo.A | Foo.B; foo = foo & ~Foo.A; 其中Foo 被声明为enum
  • @KirkWoll:在您的示例中,“foo”不是 Sweeper 示例中的 int - 您会注意到它的类型是“Foo”。如果您将“foo”更改为 int 类型,您将看到问题所在。在 Sweeper 的示例中,“Flags”是 int 类型。
【解决方案2】:

要获得最佳转换,首先了解 VB 为您所做的隐式转换会有所帮助:

Flags = Flags And Not (CInt(MyEnum.Value))

这相当于C#代码:

Flags = Flags & ~(int)MyEnum.Value;

可以缩短:

Flags &= ~(int)MyEnum.Value;

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

【讨论】:

    【解决方案3】:

    您可能会混淆 LogicalBitwise 一元运算符

    让我们访问帮助

    Operators (C# Programming Guide)

    一元运算符

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

    Compiler Error CS0023

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

    尝试将运算符应用于类型为 不是为与操作员一起工作而设计的。

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 2013-11-06
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多