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? Vous obtenez une erreur sur la ligne DOSOMPHOIGHT: P> Erreur 1 L'appel est ambigu entre les méthodes ou les propriétés suivantes: 'Dosomething (int?)' et 'Dosomething (myenum)' P>
blockquote> Cependant, si vous modifiez le zéro en un autre numéro, il n'y a pas de tel problème. p> p>
3 Réponses :
Ceci est parce que le littéral Donc, dans la première situation, le Si vous modifiez le 0 code> est implicitement convertible à n'importe quel
Enum code>. P>
0 code> est "également" convertible en
int? code> ou
myenum code>. Aucune conversion n'est «meilleure» que l'autre que le compilateur ne sait pas quelle méthode vous attendez appelez. P>
0 code> sur un
1 code>, il fonctionne car
1 code> est pas em> implicitement convertible à < Code> myenum code>, la seule méthode correspondante est celle qui prend un
int? code> argument. p>
Et si vous avez un énumé comme Enum test {CATS = 7} code>?
Cela n'explique pas pourquoi le code fonctionne si vous n'utilisez pas un integer nullable: DOSMATHIAT (Valeur int) code>?
@Darin: L'OP n'a pas demandé cela, mais si vous utilisez int code> plutôt que
int? Code> 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 code> est implicitement convertible à n'importe quel
Enum code>. (Et tout entier non nul peut être explicitement couplé à tout
enum code>, en supposant que la plage du type sous-jacent peut l'accueillir.)
La spécification de langue C # stipule qu'il existe une conversion implicite du littéral entier Une conversion d'énumération implicite permet de convertir le littéral décimal-integer 0 à convertir en un type d'enum. P>
blockQuote>
Par conséquent, tout autre littéral entier ne peut convertir que vers Peu importe les valeurs définies dans votre énum. Même si vous avez un énumé comme 0 code> à n'importe quel type d'énum: p>
13.1.3 Conversions d'énumération implicites h2>
int? code> et est donc sans ambiguïté; mais le littéral
0 code> est convertible sur les deux
int? code> et votre énum. p>
Enum test {CATS = 7} code>, 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. P>
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.
Une conversion d'énumération implicite permet de convertir le littéral décimal-integer 0 à convertir en un type d'enum. P>