2016-12-07 9 views
4

Was ist der Unterschied zwischen diesen beiden Methoden?Was ist der Zweck der Beschränkung auf eine Basisklasse?

public void Add<T>(T item) where T : Product 

public void Add(Product item) 

Von dem, was ich verstehe, werden beide nur Argumente akzeptieren, die von Product Art sind oder daraus abzuleiten.

Hier habe ich Methoden verwendet, um die Frage zu veranschaulichen, aber das gleiche gilt für Klassen.

+0

Sie können viel mehr Dinge mit Generika tun, aber ich denke, dass Sie hier kein Beispiel setzen müssen. –

Antwort

4

Die erste Methode können Sie Dinge wie typeof(T) tun, die Sie nicht mit dem nicht-generischen Typ konnten, da das Objekt selbst Null sein kann (da Sie item.GetType() aufrufen müssten).

Sie sind auch in der Lage den Rückgabetyp zu diktieren (wenn anstatt es nicht leer ist), etwa so:

public class Butter : Product { } 
public class Egg : Product { } 
public class Product { } 

public T AddGeneric<T>(T item) where T : Product 
{ 
    //Do something 
    return item; 
} 

public Product Add(Product item) 
{ 
    //Do something 

    return item; 
} 

//Even though we know it's going to return an Egg, we still need to cast here 
//If we want to treat t as an Egg, rather than as a Product 
Product t = Add(new Egg()); 

//No cast needed 
Egg tt = AddGeneric(new Egg()); 

Beachten Sie auch, dass eine generische Methode eine Methode pro Typen bei der Kompilierung erstellen (und zur Laufzeit beim Aufruf über Reflektion).

+0

"Wir müssen immer noch hier" - was bedeutet das eigentlich? https://dotnetfiddle.net/KfxXLB – zerkms

+0

@zerkms Ich meinte, wenn wir wollten, dass 't' ein' Ei' anstatt ein 'Produkt' ist, dann müsstest du es umwandeln. Ich habe das bearbeitet, um das deutlicher zu machen – Rob

2

Beide sind in der gleichen Weise, dass sie alles zu item tun können, die auf einem Product getan werden kann.

Die ehemalige obwohl kann auch Dinge mit einem Typ im Zusammenhang mit dem Typ T. Wenn T vom Typ PremiumProduct wäre, dann könnte es item zu einem List<PremiumProduct> hinzufügen, während der andere nicht, weil ein dafür nicht ausreicht.

Verwandte Themen