Soweit ich weiß, können Interfaces nicht instanziiert werden.
Wenn das stimmt, warum kompiliert und führt der folgende Code aus? Es ermöglicht Ihnen, eine variable Schnittstelle zu erstellen. Warum ist das möglich?
Schnittstelle:
%Vor%InCode:
%Vor%Ergebnis:
UPDATE:
Es passiert nur, wenn das Array deklariert wurde. Keine einzige Instanz.
Sie erzeugen keine Schnittstelle, sondern ein Array dieser Schnittstelle.
Sie können diesem Array eine Instanz einer Klasse zuweisen, die IDynamicCode<string>
implementiert. Angenommen, Sie haben public class Foo : IDynamicCode<string> { }
, können Sie das instanziieren und es einem Element dieses Arrays zuweisen:
Das Instanziieren der Schnittstelle würde nicht kompiliert:
%Vor% Sie erstellen keine Instanz der Schnittstelle. Sie erstellen ein Array, das eine Anzahl von Objekten enthalten kann, die IDynamicCode
entsprechen. Zu Beginn haben die Einträge ihren Standardwert, nämlich null
.
Dies erzeugt keine Schnittstellenvariable
Dadurch wird ein Array erstellt, in dem jedes Element die Schnittstelle implementiert. Wenn Sie x[0] = new IDynamicCode<string>();
schreiben, erhalten Sie den Fehler. Alle Elemente sind null
, daher müssen Sie jedem Element ein Objekt zuweisen, das IDynamicCode
Nur eine interessante Randnotiz:
Obwohl es konzeptionell nicht möglich ist, ist es syntaktisch unter bestimmten Umständen möglich, eine Schnittstelle zu instanziieren .
.NET hat etwas namens CoClassAttribute , die den Compiler anweist, die markierte Schnittstelle als spezifizierten konkreten Typ zu interpretieren. Die Verwendung dieses Attributs würde den folgenden Code vollkommen gültig machen und keinen Kompilierzeitfehler auslösen (beachten Sie, dass dies kein Array wie im ursprünglichen Post ist):
%Vor%Eine typische Deklaration eines solchen Attributs würde folgendermaßen aussehen:
%Vor%Sollte dieses Attribut jemals benutzt werden und wenn, wo? Die Antwort ist "meistens nie"! Es gibt jedoch ein paar Szenarien, die für COM-Interop spezifisch sind, wo dies ein nützliches Merkmal sein wird.
Mehr kann über die folgenden Links über das Thema gelesen werden:
wenn Sie
anrufen %Vor%Konstruktoren werden nicht aufgerufen. Sie werden nur erklärt.