5
votes

Opérateur '!' ne peut pas être appliqué à l'opérande de type x

J'ai donc du code en VB que j'essaye de convertir en C #. Ce code a été écrit par quelqu'un d'autre et j'essaie de le comprendre mais avec quelques difficultés. J'ai un opérateur binaire et une comparaison d'énumérations à faire, mais continuez à lancer une erreur:

Je ne peux pas dire que j'ai utilisé beaucoup de ces syntaxes auparavant et je ne sais pas comment écrire ce code. J'ai utilisé Google pour en savoir plus et j'ai également utilisé des convertisseurs en ligne VB vers C # dans l'espoir d'obtenir des conseils de base, mais rien. Le code ci-dessous

VB - Ceci est le code original qui fonctionne

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

C # - le code que j'ai converti qui génère une erreur

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

Erreur - L'erreur qui est renvoyée à chaque fois

Opérateur '!' ne peut pas être appliqué à l'opérande de type MyEnum '.

Toute aide et quelques explications à ce sujet seront grandement appréciées.


1 commentaires

! n'est pas un opérateur au niveau du bit, vous vouliez probablement dire ~


3 Réponses :


4
votes

Vous confondez peut-être les opérateurs unaires Logique et Bitwise

Permet de visiter l'aide

Opérateurs (Guide de programmation C # )

Opérateurs unaires

  • + x Identité
  • -x Négation
  • <₹ ! x Négation logique
  • <₹ ~ x Négation au niveau du bit
  • ++ x Pré-incrémentation
  • --x Pré-décrémentation
  • (T) x Convertit explicitement x en type T

Erreur du compilateur CS0023

L'opérateur 'opérateur' ne peut pas être appliqué à l'opérande de type 'type'

Une tentative a été faite pour appliquer un opérateur à une variable dont le type était non conçu pour fonctionner avec l'opérateur.


0 commentaires

8
votes

! ne peut fonctionner que sur le type bool . Vous semblez utiliser certains indicateurs de bits. Dans ce cas, vous devez utiliser l'opérateur NOT au niveau du bit ~ au lieu de l'opérateur NOT logique !:

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


9 commentaires

Vous aurez besoin d'un cast de la valeur enum en un int.


@DaveDoknjas pourquoi dites-vous cela? Je crois que ce n'est pas vrai, car le type sous-jacent de l'énumération serait un int et donc l'opérateur ~ fonctionne très bien sans casting.


@KirkWoll: L'opérateur binaire '&' n'est pas défini pour int et aucune énumération (c'est l'erreur réelle que vous obtiendrez), vous devez donc effectuer un cast.


@DaveDoknjas ne sais pas de quoi vous parlez. Cela fonctionne parfaitement bien: var foo = Foo.A | Foo.B; foo = foo & ~ Foo.A; Foo est déclaré comme un enum .


De plus, de cours & est défini pour int . int i = 0 & 5; est parfaitement valide.


@KirkWoll Dave Doknjas a raison. Toutes les énumérations ont un opérateur ~ qui renvoie une énumération, mais la résolution de surcharge pour & échoue lorsque vous avez un int et un MyEnum < / code>. Lisez la section 7.5.3 des spécifications de langue.


@Sweeper, comme je l'ai dit, foo = foo & ~ Foo.A fonctionne parfaitement bien. Est-ce que je manque quelque chose?


@KirkWoll: Dans votre exemple, "foo" n'est pas un int comme dans l'exemple de Sweeper - vous remarquerez que son type est "Foo". Si vous changez "foo" pour qu'il soit de type int, vous verrez le problème. Dans l'exemple de Sweeper, "Flags" est de type int.


Ah merci! Vous avez tous les deux raison. Mais cela laisse la question de savoir pourquoi Flags n'est pas déclaré comme le type enum réel dans ce cas où rien de tout cela ne serait nécessaire.



6
votes

Pour obtenir la meilleure conversion, il est utile de comprendre d'abord la conversion implicite que VB effectue pour vous:

Flags &= ~(int)MyEnum.Value;

Ceci est équivalent au code C #:

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

Ce qui peut être raccourci:

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

En VB, "Not" est à la fois l'opérateur logique et bit à bit, selon le contexte, mais en C # vous ont deux opérateurs distincts.


0 commentaires