Konvertierung von Dictionary zu IDictionary



  • Servus,

    ich habe ein kleines Konvertierungsproblem.
    Ich habe ein Dictionary, das sieht so aus:

    Dictionary<string, List<string>> dict = ...
    

    Jetzt habe ich in einer anderen Klasse folgende Methode

    public static bool Write(string fileName, IDictionary<string, IEnumerable<string>> table)
    

    Wenn ich versuche das Dictionary an die Methode zu übergeben, kriege ich folgende Fehlermeldung

    Fehler 1
    Die beste Übereinstimmung für die überladene ExcelWriter.Write(string, IDictionary<string, IEnumerable<string>>)-Methode hat einige ungültige Argumente.
    Fehler 2
    2-Argument: Kann nicht von "Dictionary<string, List<string>>" in "IDictionary<string, IEnumerable<string>>" konvertiert werden.

    Über Hilfe wäre ich erfreut.

    Mit freundlichen Grüßen



  • Die Konvertierung von Dictionary zu IDictionary ist nicht das Problem, sondern die ungleichen Typparameter. Der Code wäre nicht typkorrekt, wenn man das durchgehen ließe. Write könnte ja ein beliebiges anderes IEnumerable, was keine List ist, in das Dictionary einfügen.

    Als Lösung fällt mir nur ein Adapter ein, also eine Implementierung von IDictionary<string, IEnumerable<string>>, die dein Dictionary<string, List<string>> kapselt und die Typprüfungen ggf. zur Laufzeit durchführt. (Vielleicht gibts sowas auch schon fertig, wär ja möglich.)



  • Oder aus der Write-Methode einfach eine generische Methode machen:

    public static bool Write<TValue>(string fileName, IDictionary<string, TValue> table)
    


  • Oder das Dictionary auf Dictionary<string, IEnumerable<string>> umstellen.



  • Gefuehlt muesste auch ein

    public static bool Write(string fileName, IDictionary<string, out IEnumerable<string>> table)
    

    reichen.



  • Shade Of Mine schrieb:

    Gefuehlt muesste auch ein

    public static bool Write(string fileName, IDictionary<string, out IEnumerable<string>> table)
    

    reichen.

    So funktioniert das mit der Variance leider nicht.



  • Das hatte ich auch "gefühlt", allerdings vorher nochmal schnell ausprobiert 😉



  • out und in als kontextabhängige Schlüsselwörter für Co- und Contravarianz sind nur bei Generic-Interface- und Delegate-Definitionen möglich. (Bei Interfaces direkt bei den Typparametern des Generics). Nicht bei Methodenparametern. Also es liegt nicht am konkreten Fall, dass es nicht möglich ist. C# bietet etwas in dieser Richtung einfach nicht.

    Verwendet überhaupt jemand Varianz bei eigens definierten Interfaces?


Anmelden zum Antworten