2016-05-04 2 views
2

Kann jemand erklären den Unterschied, wenn eine zwischenUnterschied zwischen generischen Methode mit Interface-Einschränkung und Verfahren mit Schnittstellenparameter

public void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable 
    { 
     T temp; 
     if (lhs.CompareTo(rhs) > 0) 
     { 
      temp = lhs; 
      lhs = rhs; 
      rhs = temp; 
     } 
    } 

Und

public void SwapIfGreater(ref System.IComparable lhs, ref System.IComparable rhs) 
    { 
     System.IComparable temp; 
     if (lhs.CompareTo(rhs) > 0) 
     { 
      temp = lhs; 
      lhs = rhs; 
      rhs = temp; 
     } 
    } 

Es scheint mir, sobald Sie Ihre generische Methode einschränken Um nur Parameter zu akzeptieren, die eine Schnittstelle implementieren, können Sie auch Parameter vom Typ Schnittstelle verwenden.

+2

Ihre zweite ermöglicht die Verwendung von Argumenten zweier verschiedener Typen (wahrscheinlich versehentlich). Es wird auch unnötiges Boxen verursachen. – Lee

+0

Sie haben Recht, danke – Tralli

+0

Eigentlich verursacht Ihre erste auch unnötige Boxen der 'rhs' Parameter beim Aufruf von' CompareTo (Objekt) '. Sie können dies vermeiden, indem Sie die Einschränkung in 'where T: IComparable ' ändern. – Lee

Antwort

4

Die generische Form erlaubt dem Compiler, die Typprüfung durchzuführen, um sicherzustellen, dass die Argumente vom selben Typ sind.

Zuvor: IComparable<T> stammt nicht von IComparable. Daher muss ein Objekt, das IComparable<T> implementiert, IComparable nicht implementieren. Diese sind miteinander unvereinbar.

+0

Das stimmt, ich kopiere es von einer anderen Seite eingefügt und habe es nicht bemerkt. Ich habe die Frage bearbeitet. – Tralli

+0

@Tralli aktualisiert. –

+0

Tatsächlich gibt der Compiler beim Testen einen Fehler, wenn die Argumente auch im zweiten nicht vom selben Typ sind. – Tralli

Verwandte Themen