2016-04-23 8 views
1

Hier ist das Problem, ich muss Methode schreiben, die generischen Typ ist, und kann nur von Typen verwendet werden, die IComparer Schnittstelle behandeln, zusätzlich meine Methode müssen T-Array und IComparer als Parameter nehmen . Die Methode sollte den maximalen Wert aus den von IComparer angegebenen Kriterien zurückgeben. Ich habe eine Testklasse mit der grundlegenden Implementierung von IComparable und IComparer geschrieben (Code unten).IComparer <T> und generische Art Methode Problem

public class TestClass : IComparable<TestClass> 
{ 
    public int CompareTo(TestClass other) 
    { 
     throw new NotImplementedException(); 
    } 


} 
public class Nested : IComparer<TestClass> 
{ 
    IComparer<TestClass> criteria; 

    public int Compare(TestClass x, TestClass y) 
    { 
     throw new NotImplementedException(); 
    } 
} 


static void Main(string[] args) 
    { 
     Nested x = new Nested(); 
     TestClass[] tab = { new TestClass() }; 
     Tools.ElementsMax<TestClass>(tab, x); 

    } 

Wenn ich versuche Methode i diesen Fehler zu testen:

Blockquote Error CS0311 The type 'x.TestClass' cannot be used as type parameter 'T' in the generic type or method 'Tools.ElementsMax(T[], IComparer)'. There is no implicit reference conversion from 'x.TestClass' to 'System.Collections.Generic.IComparer'.

Ich verstehe nicht, warum genau ich diesen Fehler bin immer, ich war wirklich sicher, dass es auf diese Weise funktionieren soll , aber überraschenderweise nicht.

+0

'Tools.ElementsMax' ist, wo es Fehler gibt, aber Sie haben diesen Code nicht enthalten. – Yatrix

+0

Ah, ja ich habe es nicht aus Versehen aufgenommen, tut mir leid. Hier ist die Methode. 'public static T ElementsMax (T [] arrayParameter, IComparer Kriterien) wobei T: IComparer { return arrayParameter [1]; } – banneh

+1

@Banneh Ich vermutete es richtig - Ihre Methode hat eine falsche Einschränkung in seiner Unterschrift :-) – dasblinkenlight

Antwort

1

I have to write method which is generic type, and can only be used by types which handle IComparer interface, in addition my method need to take T array and IComparer as parameter.

Sie wahrscheinlich gemeint "die IComparable Schnittstelle handhaben", nicht IComparer. Aus Ihrer Fehlermeldung erscheint es, dass Ihre ElementsMax Methode genau die Art und Weise codiert Sie es in Englisch beschrieben, dh

public static T ElementsMax<T>(T[] data, IComparer<T> c) where T : IComparer<T> 
//                 ^^^^^^^^^^^^ 

Dies ist jedoch falsch: Sie sollten T Zwang IComparable<T> stattdessen zu sein:

public static T ElementsMax<T>(T[] data, IComparer<T> c) where T : IComparable<T> 
//                 ^^^^^^^^^^^^^^ 
+0

Danke für schnelle Antwort, aber ich meinte IComparer-Schnittstelle, da es eine der gegebenen Aufgaben ist, von unserem Professor und es ist klar beschrieben dass es IComparer-Schnittstelle behandeln sollte. Gibt es eine mögliche Lösung dafür? – banneh

+0

@banneh Fragen Sie Ihren Professor, wenn er einen Tippfehler gemacht hat; Ich bin mir sicher, dass er es getan hat. 'IComparer ' macht dort keinen Sinn, während 'IComparable 'durchaus sinnvoll ist. – dasblinkenlight

+0

Für mich hat 'IComparer ' auch keinen Sinn ergeben, aber soweit es mich betrifft, ist die Methode für die Verwendung in der Klasse gedacht und liefert den maximalen Wert basierend auf einem der Kriterien in 'IComparer', ex. Name Länge oder Geburtsjahr in der Klasse, das ist, wo 'IComparer' für mich Sinn macht. – banneh

Verwandte Themen