3 Stimmen

Warum macht dynamisch nicht die Annahme, dass es diese Operation unterstützen kann?

Ich habe eine Klasse wie diese:

public sealed class Repository : IRepository
    where T : RepositoryEntryBase, IRepositoryEntry, new() 
{
    /*Insert Stuff Here*/
}

Ich versuche, diese Klasse so zu instanziieren:

Repository v = new Repository();

und ich erhalte einen Fehler wie diesen:

Der Typ 'dynamic' kann nicht als Typparameter 'T' im generischen Typ oder Methode 'ServiceLibraries.Repositories.Repository' verwendet werden. Es gibt keine implizite Referenzkonvertierung von 'dynamic' zu 'Data.IRepositoryEntry'.

Die MSDN-Dokumentation sagt jedoch folgendes:

Zur Compile-Zeit wird angenommen, dass ein Element, das als dynamisch getypt ist, jede Operation unterstützt.

Gibt es etwas, das ich übersehe? Gedanken dazu, wie ich das lösen kann?

6voto

Jon Skeet Punkte 1325502

Betrachten Sie nicht-dynamischen Code innerhalb von Repository. Es könnte folgendes enthalten:

IRepositoryEntry entry = new T();

Das ist vollkommen gültiger Code - funktioniert jedoch nicht mit T=dynamic.

Sie können jede Operation auf einem Wert vom Typ dynamic durchführen, aber das bedeutet nicht, dass Sie dynamic in jeder Situation verwenden können - und Generics sind genau ein Beispiel dafür, wo das einfach nicht funktioniert.

Es ist wichtig, dass die "Dynamik" nur den Code betrifft, der (zur Kompilierzeit) weiß, dass er dynamic verwendet... was zum Beispiel nicht den Code von Repository hier einschließt.

3voto

Nathan A Punkte 10891

Basierend auf dem Fehler erfordert Repository, dass T IRepositoryEntry implementiert. Allerdings kann dynamic nicht nachweisen, dass es dieses Interface implementiert.

Was Generics betrifft, ist dynamic gleichbedeutend mit object, und Sie könnten auch nicht Object für den Typ T verwenden.

0voto

MDiesel Punkte 2637

Wenn Sie 'T' in Ihrer Klassendefinition verwenden, beziehen Sie sich auf einen generischen Typ (nicht unbedingt einen dynamischen Typ). Außerdem erzwingt Ihre Klassendefinition, dass der Typ, der von Ihrem Repository erbt, auch von RepositoryEntryBase erben und IRepositoryEntry implementieren muss. Ein dynamischer Typ erfüllt diesen Vertrag nicht

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