2016-06-13 9 views
0

Ich versuche, Max-Wert eines T [] - Array mit der folgenden Methode zurückzugeben. Ich verstehe nicht, warum Compiler hier beschwert T max = _genericList[0];, dass Fehler cannot implicitly convert ...\GenericList(9) to ...\GenericList(123) löst.C# Inkompatibilität in zwei T-Typen in der generischen Methode, die T-Typ zurückgeben

Warum sind diese beiden verschieden? Ich möchte das T [] einer GenericList-Klasse verwenden, um durch sie zu interpolieren und das Maximum/Minimum zu finden. Wie ist das möglich?

internal class GenericList<T> 
{ 
    private T[] _genericList; 
    private int _count; 
    private int _listInnitialLength; 

public GenericList(int listLength) 
    { 
     _genericList = new T[listLength]; 
     _count = 0; 
     _listInnitialLength = listLength; 
    } 

    public T Max<T>() where T : IComparable 
    { 
     T max = _genericList[0]; 
     foreach (T item in _genericList) 
     { 
       if (Comparer<T>.Default.Compare(item, max) > 0) 
       { 
        max = item; 
       } 
     } 
     return max; 
    } 
} 

Antwort

2

Ihre T in Verfahren Max<T> nicht die in der Klasse definiert ist GenericList<T>, auch sie denselben Namen haben. Ich denke, Sie sollten die Einschränkung in die Klasse verschieben und Max Methode nicht-generisch machen.

internal class GenericList<T> where T : IComparable 
{ 
    //.... 
    public T Max() 
    { 
     //.... 
    } 
} 
+0

Vielen Dank Ich war mir nicht bewusst, dass Sie keine generische Methode in einer generischen Klasse verwenden können, die den gleichen Typ verwendet, der logisch korrekt ist. Es war alles meine Schuld. –

3

Ihr Problem ist hier:

public T Max<T>() where T : IComparable 

Sie haben soeben overrided T in Klassendeklaration definiert. Sollte sein:

internal class GenericList<T> where T : IComparable 
{ 
    private T[] _genericList; 
    private int _count; 
    private int _listInnitialLength; 

    public GenericList(int listLength) 
    { 
     _genericList = new T[listLength]; 
     _count = 0; 
     _listInnitialLength = listLength; 
    } 

    public T Max() 
    { 
     T max = _genericList[0]; 
     foreach (T item in _genericList) 
     { 
      if (Comparer<T>.Default.Compare(item, max) > 0) 
      { 
       max = item; 
      } 
     } 
     return max; 
    } 
} 
0

Die anderen Antworten Ihr Problem beheben, aber warum Comparer<T>.Default verwenden, wenn T bereits IComparable implementiert?