2010-09-08 15 views
1

J'ai ajouté une méthode d'extension qui est un raccourci vers string.Format:Méthodes d'extension VS résolution de méthode statique - qu'est-ce qui me manque dans la spécification?

public static string Format(this string format, params object[] args) 
{ 
    return String.Format(format, args); 
} 

Quand j'invoque cette méthode comme ceci:

"{0}".Format(1); 

tout fonctionne comme un charme. Alors que

"{0}".Format("1"); 

ne compile pas avec ce message d'erreur:

erreur CS0176: Membre 'string.Format (string, params objet [])' ne peut pas être accessible avec une référence d'instance ; le qualifier avec un nom de type à la place

J'ai corrigé ce problème en renommant une méthode (c'était une douleur). Mais pourquoi cela arrive-t-il? Je connais l'extension par rapport à la priorité d'instance - mais ce n'est pas une méthode d'instance. Et IMO si un chemin ne pouvait pas être résolu (référençant la méthode statique dans un contexte non statique) alors l'autre (entièrement légitime) devrait être tenté. Qu'est-ce qui me manque dans les spécifications?

Mise à jour 1 Ajout d'un message d'erreur de compilation.

+0

Quel est le message d'erreur de compilation? – thecoop

+0

Merci. J'ai ajouté un message d'erreur à la question racine. –

Répondre

3

La section 7.5.3.1 (applicabilité de l'élément de fonction) ne dit rien sur le fait qu'un membre soit statique ou non. En d'autres termes, la méthode statique String.Format(String, params Object[] args) est toujours applicable dans votre deuxième appel, même si elle ne fonctionne pas réellement.

Les méthodes d'extension sont recherchées uniquement si aucun membre de fonction applicable n'est trouvé. En d'autres termes, la recherche de membre est effectuée sur un de type et un ensemble d'arguments (et potentiellement des arguments de type). La validation du résultat de la recherche de membres est effectuée plus tard, en tant qu'étape finale de la section 7.6.5.1.

+0

Si applicable! = Compilable - alors c'est logique. Je suis d'accord. Ce serait mieux si ces raccourcis fonctionnaient, cependant :). –