6 Stimmen

Allgemeine Schnittstellen

Hier ist mein Code

public interface ITranslator<E, R>
{       
    E ToEntity<T>(R record);
}

class Gens : ITranslator<string, int>
{
    #region ITranslator<string,int> Members

    public string ToEntity<MyOtherClass>(int record)
    {
        return record.ToString();
    }

    #endregion
}

Wenn ich dies kompiliere, erhalte ich einen Fehler Type parameter declaration must be an identifier not a type

Warum kann ich nicht haben ToEntity<MyOtherClass> kann aber nur ToEntity<T> ??

Bearbeiten: Was ist MyOtherClass tun? Ich konvertiere zwischen Entitäten (POCOs Äquivalent des Entity Frameworks) und Datensätzen (vom Framework zurückgegebene Objekte) für mehrere Tabellen/Klassen. Daher möchte ich dies verwenden, um meine klassenspezifische Konvertierung durchzuführen

9voto

Dan Tao Punkte 121990

Ihre Schnittstelle hat eine generische ToEntity<T> Methode, die Sie in Ihrer Implementierungsklasse zu einer nicht-generischen Methode gemacht haben Gens como ToEntity<MyOtherClass> . (A generisch Methode könnte jeden beliebigen Typ-Parameter annehmen, möglicherweise unter Berücksichtigung bestimmter Beschränkungen für T . Ihr Gens Klasse versucht, eine Definition zu liefern für ToEntity nur für den Typ-Parameter MyOtherClass was den Zweck von Generika zunichte macht).

In Ihrem Code-Beispiel ist es unklar, wie Ihr Gens Klasse versucht, die MyOtherClass Typ; er ist sicherlich nicht in die Logik der ToEntity . Wir benötigen mehr Informationen, um Ihnen weiterhelfen zu können.

Zur Veranschaulichung: Ihre derzeitige Definition des Begriffs ITranslator<E, R> Schnittstelle bietet, in einfachem Englisch:

"Ich biete einen Mechanismus zur Übersetzung jeden Datensatz des Typs R in eine Einheit des Typs E , dieser Mechanismus ist von einem beliebigen benutzerdefinierten Typ abhängig ist T ."

Ihr Gens Klasse hingegen "implementiert" die obige Schnittstelle so, wie sie derzeit gestaltet ist:

"Ich kann ganze Zahlen in Zeichenketten übersetzen. Ich liefere die Illusion der Erlaubnis der Benutzer einen Typ angeben kann, um zu steuern wie diese Übersetzung durchgeführt wird, aber in Wirklichkeit gibt es keine Wahl des Typs. Die MyOtherClass Klasse beteiligt ist Das ist alles, was ich sagen kann."

Aus diesen beiden Beschreibungen geht hervor, dass die Gens Klasse nicht wirklich das tut, was der ITranslator<E, R> Schnittstellengarantien . Es ist nämlich nicht bereit, einen vom Benutzer angegebenen Typ für seine ToEntity Methode. Deshalb lässt sich dieser Code nicht kompilieren.

2voto

Joel Etherton Punkte 36629

Sie müssen eine Einschränkung für einen generischen Typ deklarieren.

public string ToEntity<T>(int record) where T : MyOtherClass

1voto

Josh Punkte 66190

Das kompiliert für mich in LINQpad OK. Vielleicht haben Sie irgendwo einen Typ namens E, R oder T?

Ahh ich sehe, was Sie versuchen zu tun... Sie haben MyOtherClass als eine Klasse irgendwo definiert noch Sie versuchen, es als ein Typ-Argument in ToEntity zu verwenden. Wie genau wollen Sie MyOtherClass in ToEntity beteiligt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X