2013-09-22 15 views
8

diesen Code vor:Aufruf generische Methode in C#

static void Main(string[] args) 
{ 
    Get<Student>(new Student()); 
    System.Console.Read(); 
} 

public static void Get<T>(T person) 
{ 
    Console.WriteLine("Generic function"); 
} 
public static void Get(Person person) 
{ 
    person.Show(); 
} 

Diese meine Person Klasse:

class Person 
{ 
    public void Show() 
    { 
     Console.WriteLine("I am person"); 
    } 
} 
class Student : Person 
{ 
    public new void Show() 
    { 
     Console.WriteLine("I am Student"); 
    } 
} 

ich Get nennen und übergeben Schüler zum method.Like dies:

Get<Student>(new Student()); 

So bekomme ich das: Generic function. Aber wenn ich Get so anrufen:

Get(new Student()); 

Ich erwarte, dass diese Get(Person person) nennen called.but wieder zu: Get<T>(T person). Warum hat Compiler dieses Verhalten?

+5

Schauen Sie [hier] (http://StackOverflow.com/Questions/3679562/generic-methods-and-method-overloading), die Frage ist im Grunde die gleiche – Save

+5

Die genauen Regeln für die Überlastung Vorrang sind kompliziert und in der Spezifikation : aber ich vermute, es ruft tatsächlich "Get (Student)" - was eine genaue Übereinstimmung ist; 'Get (Person)' ist * nicht * eine exakte Übereinstimmung, da Sie einen Student und keine Person übergeben –

Antwort

13

Ich kann Ihnen das Jon Skeet Buch C# in Depth (zweite Ausgabe für jetzt), eine Kapitelnummer 9.4.4 verweisen. Ich habe den Text so geändert, dass er in Ihre Situation passt.

Die Auswahl der richtigen ladenen Methode

An diesem Punkt hält der Compiler die Konvertierung von Student Student, und von Schüler zu Person. Eine Konvertierung von einem beliebigen Typ in selbst ist besser als jede Konvertierung in einen anderen Typ, so dass Get (T x) mit T als Student Methode besser ist als Get (Person y) für diesen bestimmten Aufruf.

Es gibt ein bisschen mehr Erklärung in dem Buch und ich kann Ihnen mindestens stark empfehlen, es gründlich zu lesen.

Verwandte Themen