Est-ce un bug?
Oui.
Félicitations, vous avez trouvé un bug dans la résolution de surcharge. Le bug se reproduit en C# 4 et 5; ne pas reproduire dans la "Roslyn" version de l'analyseur sémantique. J'ai informé le C# 5 l'équipe de test, et nous espérons que nous pouvons obtenir ce étudiés et résolus avant la version finale. (Comme toujours, pas de promesses.)
Une analyse correcte de la façon suivante. Les candidats sont:
0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string)
3: C(string, object)
Candidat zéro est évidemment inapplicable car string
n'est pas convertible en string[]
. Qui laisse trois.
De trois, nous devons déterminer un unique meilleure méthode. Nous faire des comparaisons par paires des trois candidats restants. Il y a trois de ces paires. Elles ont toutes identiques listes de paramètres une fois que nous dépouiller les omis paramètres facultatifs, ce qui signifie que nous devons aller à l'avancée de bris d'égalité en rond décrit dans la section 7.5.3.2 de la spécification.
Ce qui est mieux, 1 ou 2? Pertinentes de bris d'égalité est qu'une méthode générique est toujours moins bien qu'une non-méthode générique. 2 est pire que le 1er. Donc 2 ne peut pas être le gagnant.
Lequel est le meilleur, le 1 ou le 3? Pertinentes de bris d'égalité est: une méthode applicable uniquement dans sa forme étendue est toujours pire qu'une méthode applicable dans sa forme normale. Donc 1 est pire que de 3. Donc 1 ne peut pas être le gagnant.
Ce qui est mieux, 2 ou 3? Pertinentes de bris d'égalité est qu'une méthode générique est toujours moins bien qu'une non-méthode générique. 2 est pire que de 3. Donc 2 ne peut pas être le gagnant.
Être choisi à partir d'un ensemble de plusieurs applicable candidats le candidat doit être (1) invaincu, (2) battre au moins un autre candidat, et (3) le candidat qui a les deux premières propriétés. Candidat de trois est battue par aucun autre candidat, et bat au moins un autre candidat; il est le seul candidat à cette propriété. Par conséquent, le candidat des trois est l' unique meilleur candidat. Elle devrait gagner.
Non seulement est le C# 4 compilateur de faire des erreurs, comme vous l'avez justement remarque il est à un étrange message d'erreur. Que le compilateur est d'obtenir la résolution de surcharge de l'analyse de mal, c'est un peu surprenant. Qu'il est d'obtenir le message d'erreur de mal, c'est totalement surprenant; le ambiguë "méthode" erreur heuristique fondamentalement choisit un des deux méthodes à partir de l'ensemble candidat si une meilleure méthode ne peut pas être déterminé. Il n'est pas très bon à trouver le "réel" de l'ambiguïté, si en fait il y en a un.
On peut raisonnablement se demander pourquoi ce qui est. Il est assez difficile de trouver deux méthodes qui sont "unambigously ambigu" parce que le "betterness" est intransitif. Il est possible d'en arriver à des situations où la candidate 1 est mieux que le 2, le 2 est mieux que le 3, et 3 est meilleure que 1. Dans de telles situations, nous ne pouvons pas faire mieux que de choisir deux d'entre eux comme "l'ambigu".
Je voudrais améliorer cette heuristique pour Roslyn, mais c'est une faible priorité.
(Exercice au lecteur: "Concevoir un linéaire en temps de l'algorithme pour identifier l'unique meilleur membre d'un ensemble de n éléments, où la betterness relation est intransitif" a été l'une des questions que j'ai posé la journée que j'ai interviewées pour cette équipe. Ce n'est pas très dur de l'algorithme; donner un coup de feu.)
L'une des raisons pour lesquelles nous avons repoussé sur l'ajout d'arguments optionnels C# pour si longtemps, c'est le nombre complexe de situations ambiguës il introduit dans l'algorithme de résolution de surcharge; apparemment, nous n'avons pas droit.
Si vous souhaitez entrer une question de connexion à suivre, n'hésitez pas. Si vous voulez juste qu'elle a porté à notre attention, c'est réglé. Je vais suivre avec les tests de l'année prochaine.
Merci pour avoir porté à mon attention. Toutes nos excuses pour cette erreur.