9
votes

Quelqu'un peut-il expliquer ce problème C # intéressant?

Je frappe un problème bizarre plus tôt que j'ai répliqué dans une nouvelle demande de console. Je me demande, quelqu'un peut-il expliquer pourquoi cela se produit? XXX

Vous obtenez une erreur sur la ligne DOSOMPHOIGHT:

Erreur 1 L'appel est ambigu entre les méthodes ou les propriétés suivantes: 'Dosomething (int?)' et 'Dosomething (myenum)'

Cependant, si vous modifiez le zéro en un autre numéro, il n'y a pas de tel problème.

c#

0 commentaires

3 Réponses :


8
votes

Ceci est parce que le littéral 0 est implicitement convertible à n'importe quel Enum .

Donc, dans la première situation, le 0 est "également" convertible en int? ou myenum . Aucune conversion n'est «meilleure» que l'autre que le compilateur ne sait pas quelle méthode vous attendez appelez.

Si vous modifiez le 0 sur un 1 , il fonctionne car 1 est pas implicitement convertible à < Code> myenum , la seule méthode correspondante est celle qui prend un int? argument.


4 commentaires

Et si vous avez un énumé comme Enum test {CATS = 7} ?


Cela n'explique pas pourquoi le code fonctionne si vous n'utilisez pas un integer nullable: DOSMATHIAT (Valeur int) ?


@Darin: L'OP n'a pas demandé cela, mais si vous utilisez int plutôt que int? Aucune conversion n'est requise pour cette méthode, donc c'est une meilleure correspondance.


@SLC: Peu importe les valeurs que vous utilisez, le littéral 0 est implicitement convertible à n'importe quel Enum . (Et tout entier non nul peut être explicitement couplé à tout enum , en supposant que la plage du type sous-jacent peut l'accueillir.)



16
votes

La spécification de langue C # stipule qu'il existe une conversion implicite du littéral entier 0 à n'importe quel type d'énum:

13.1.3 Conversions d'énumération implicites

Une conversion d'énumération implicite permet de convertir le littéral décimal-integer 0 à convertir en un type d'enum.

Par conséquent, tout autre littéral entier ne peut convertir que vers int? et est donc sans ambiguïté; mais le littéral 0 est convertible sur les deux int? et votre énum.

Peu importe les valeurs définies dans votre énum. Même si vous avez un énumé comme Enum test {CATS = 7} , le ci-dessus s'applique toujours. N'oubliez pas que toutes les énumes peuvent avoir toutes les valeurs de leurs types d'entiers sous-jacents et ne sont pas limités aux valeurs effectivement déclarées.


2 commentaires

C'est intéressant, que se passe-t-il si vous avez une énumération de {chats = 7} et vous lancez zéro, qu'est-ce que vous obtenez alors?


@SLC: la valeur 0, bien sûr. De même, si vous avez lancé 47, vous obtenez la valeur 47, dactylographiée en tant que type Enum. Comme je l'ai dit, les types ENum ne sont pas limités aux valeurs déclarées. Vous pouvez lancer n'importe quel entiteur de type entier à n'importe quel type d'énumération dont le type d'entier sous-jacent est le même.



0
votes

Une conversion d'énumération implicite permet de convertir le littéral décimal-integer 0 à convertir en un type d'enum.


0 commentaires