Оператор '!' не может быть применен к операнду типа x - PullRequest
0 голосов
/ 05 января 2019

Итак, у меня есть некоторый код на VB, который я пытаюсь преобразовать в C #. Этот код был написан кем-то другим, и я пытаюсь понять его, но с некоторыми трудностями. У меня есть побитовый оператор и сравнение enum, но я продолжаю выдавать ошибку:

Я не могу сказать, что раньше я использовал много этих синтаксисов и озадачен тем, как писать этот код. Я использовал 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 '.

Буду весьма признателен за любую помощь и некоторые пояснения по этому поводу.

Ответы [ 3 ]

0 голосов
/ 05 января 2019

! может работать только на типе bool. Вы, кажется, работаете с некоторыми битовыми флагами. В этом случае вы должны использовать побитовый оператор NOT ~ вместо логического оператора NOT !:

Flags = Flags & ~((int)MyEnum.Value); // you need to cast to int as well
0 голосов
/ 05 января 2019

Чтобы получить лучшее преобразование, сначала нужно понять неявное преобразование, которое VB делает для вас:

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

Это эквивалентно коду C #:

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

Что может быть сокращено:

Flags &= ~(int)MyEnum.Value;

В VB "Not" является как логическим, так и побитовым оператором, в зависимости от контекста, но в C # у вас есть два различных оператора.

0 голосов
/ 05 января 2019

Вы, возможно, путаете Логические и Битовые унарные операторы

Пойдемте на помощь

Операторы (Руководство по программированию в C #)

Унарные операторы

  • +x Идентичность
  • -x Отрицание
  • !x Логическое отрицание
  • ~x Побитовое отрицание
  • ++x Предварительное увеличение
  • --x Предварительный декремент
  • (T)x Явно преобразует x в тип T

Ошибка компилятора CS0023

Оператор 'operator' нельзя применить к операнду типа 'type'

Была сделана попытка применить оператор к переменной, тип которой был не предназначен для работы с оператором.

...