Warum ist die Instanziierung von Schnittstellenvariablen möglich?

7

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.

    
AsValeO 18.06.2015, 11:26
quelle

5 Antworten

16

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:

%Vor%

Das Instanziieren der Schnittstelle würde nicht kompiliert:

%Vor%     
CodeCaster 18.06.2015, 11:29
quelle
13

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 .

    
Glorfindel 18.06.2015 11:29
quelle
6

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

implementiert     
dotctor 18.06.2015 11:29
quelle
5

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:

Jaanus Varus 18.06.2015 12:18
quelle
3

wenn Sie

anrufen %Vor%

Konstruktoren werden nicht aufgerufen. Sie werden nur erklärt.

    
Veronica_Awful 18.06.2015 11:32
quelle