2010-11-01 5 views
2

Je suis actuellement la lecture de Jon Skeet C de # en profondeur 2e édition et la question suivante est venu à mon esprit:Lambda à déléguer la résolution

Comment est le compilateur en mesure de choisir entre list.Sort(Comparison<T>) et list.Sort(MyComparison<T>) dans l'exemple suivant:

// MyComparison has the same signature as Comparison<in T> 
public delegate int MyComparison<in T>(T x, T y); 

public class MyList<T> : List<T> 
{ 
    // Sort is like Sort(Comparison<T>) except it takes a MyComparison<T> in parameter 
    public int Sort(MyComparison<T> comparison) 
    { 
     Console.WriteLine("Sort MyComparison<T>"); 
     return -1; 
    } 
} 

MyList<Product> list = new MyList<Product>(); 

list.Sort((product1, product2) => product1.Name.CompareTo(product2.Name)); 

// Equivalent to 
list.Sort(new MyComparison<Product>((product1, product2) => product1.Name.CompareTo(product2.Name))); 

// But not equivalent to... 
list.Sort(new Comparison<Product>((product1, product2) => product1.Name.CompareTo(product2.Name))); 

Merci à l'avance

Répondre

2

Si la résolution de surcharge est sur une méthode applicable, il utilisera que l'on de préférence à toutes les les méthodes déclarées ba se classes. Donc, dans ce cas, c'est comme si List<T>.Sort n'existait même pas, pour les deux premières invocations.

La troisième invocation n'est pas applicable, donc elle trouvera List<T>.Sort à la place.

Si vous déclarez une surcharge pour Sort au sein MyList (mais en Comparison<T> au lieu de MyComparison<T>) puis l'appel de méthode serait ambiguë. Pour plus de détails, voir overload resolution article.

PS Espoir vous appréciez le livre :)

+0

Merci beaucoup pour votre aide. (J'apprécie le livre, merci beaucoup d'avoir pris le temps de le mettre à jour). –

5

Il choisit celui-là parce qu'il est dans la classe des enfants et préfère ceux-ci.

Par exemple:

public class MyList<T> : List<T> 
{ 
    public int Sort2(MyComparison<T> comparison) 
    { 
    } 
    public int Sort2(Comparison<T> comparison) 
    { 
    } 
} 

Dans ce cas, il ne comprend pas plus et:

list.Sort2((product1, product2) => product1.Name.CompareTo(product2.Name)); 

et vous obtenez un "L'appel est ambigous" erreur.

+0

Merci beaucoup pour votre aide –

+0

De rien. –

+0

J'ai accepté la réponse de Jon car il m'a donné un lien pour plus de détails mais considère que votre réponse est également valide –