2017-04-06 3 views
0

Was mache ich falsch mit diesem Code?Übergabe eines Verweises auf eine Klasse, die von einer Klasse erbt, die von einer Schnittstelle erbt

Ich habe eine Schnittstelle und eine Klasse, die diese Schnittstelle erbt.

Dann habe ich eine andere Klasse, die von dieser Klasse erbt.

Wenn ich versuche, und übergeben Sie diese Klasse als Parameter an eine Methode, die ein List<that interface> nimmt ich die folgenden Fehlermeldungen erhalten:

Die beste überladene Methode Spiel für ‚Scorer (ref System.Collections.Generic.List < ISearchResult>)‘hat einige ungültige Argumente

Argument 1: aus nicht konvertieren 'ref System.Collections.Generic.List' auf 'ref System.Collections.Generic.List < ISearchResult>'

Hier sind meine Schnittstelle, Klassen- und Methodendefinitionen, und das Problem Linie codiert:

public interface ISearchResult 
{ 
    double SearchScore { get; set; } 
    string SearchIndex { get; set; } 
} 

public class SearchResult : ISearchResult 
{ 
    public double SearchScore { get; set; } 
    public virtual string SearchIndex { get; set; } 
} 

public class MyData : SearchResult 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public override string SearchIndex { get; set; } 
} 

public void Scorer(ref List<ISearchResult> results) 
{ 
    ... 

... 
List<MyData> myResults = q.ToList(); 
search.Scorer(ref myResults); //line with the errors 
... 
+0

Es ist eine Weile her, seit ich C# verwendet habe, also könnte sich das geändert haben, aber ich glaube nicht, dass Listen kovariant sind. Kann die Schnittstelle ein 'IEnumerable ' verwenden? –

+0

@EvanTrimboli, danke, aber gerade als IEnumerable versucht und der Fehler ist der gleiche. – johna

+0

Läuft ok für mich: https://gist.github.com/evantrimboli/b1d61b51e9a2724066cc375471c046c1 –

Antwort

1

Der List<T> Typ nicht covariant ist, so müssen Sie eine andere Art wählen, die zum Beispiel ist, IEnumerable<T> oder IReadOnlyCollection<T>.

Verwandte Themen