Pourquoi la méthode d’extension générique avec contrainte n’est-elle pas reconnue comme méthode d’extension?

Dupliquer possible:
Aucune inférence de type avec la méthode d’extension générique

Considérons deux méthodes:

public static IEnumerable Merge (this IEnumerable<IEnumerable> coll) public static IEnumerable Merge (this IEnumerable coll) where T : IEnumerable 

Les deux comstacknt parfaitement, dans les deux cas, le type des types génériques sera connu au moment de la compilation de l’appelant, et donc le type exact du type étendu.

Vous pouvez appeler les deux bien, mais seulement le premier comme extension.

Pourquoi?

Mise à jour 1

Pour le voir échouer, utilisez la deuxième méthode et cet exemple:

  var x = new List<List>(); var y = x.Merge(); 

Mise à jour – fermeture

Ne pensez-vous pas que le message original est trop élaboré pour obtenir une image claire? Pour des raisons pédagogiques, je pense que ce message ne devrait pas être fermé, même si techniquement (c’est-à-dire la réponse), il est dupliqué. Juste mes 2 cents.

L’inférence de type de méthode ne prend pas en compte les contraintes lors de l’inférence.

Cette même question a été posée hier. Voir ma réponse ici pour plus de détails.

Aucune inférence de type avec la méthode d’extension générique

Je ne pense pas que le problème est que le second NE PEUT PAS être appelé, mais qu’IntelliSense ne le verra pas car il ne peut pas facilement déduire le second paramètre de type générique V de votre appel sans aide explicite.

Par exemple, étant donné vos deux méthodes d’extension, les suivantes sont toutes légales

  // IEnumerable> definition... List> x = ...; // calls your first method (implicitly) x.Merge(); // also calls your first method (explicitly) x.Merge(); // calls your second method (explicitly) x.Merge, int>(); 

Les trois de ces compilations sont compilées avec succès. Je pense qu’avec les deux parameters de type génériques, il ne peut pas déduire votre deuxième paramètre de type générique de l’utilisation et, par conséquent, il ne s’affiche pas dans intellisense, mais rest légal …

MISE À JOUR : Selon le demandeur, ce n’est pas que les deux méthodes ont été déclarées en tant que surcharges, mais qu’elles étaient soit / ou. Etant donné cette raison, Merge () ne fonctionne pas sur la 2ème forme car les relations entre T et V sont définies dans les contraintes de type et ne sont donc pas utilisées pour l’inférence de type, comme Eric l’a déclaré dans sa réponse SO.