Question Les interfaces ne peuvent pas être instanciées, mais s'agit-il d'une exception [dupliquer]


Cette question a déjà une réponse ici:

Je suis très surpris de voir que je dois instancier une interface pour utiliser le Word Interoop en C #.

Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();

le Microsoft.Office.Interop.Word.Application selon ce que dit sa documentation XML est une interface:

enter image description here 

Comment est-ce possible, le studio visuel l'a-t-il confondu avec autre chose? Ou ce qui permet à cette interface d'être instanciée?


13
2018-05-20 14:54


origine


Réponses:


C'est parce que c'est une interface COM. Interfaces COM - et seulement Interfaces COM - peuvent être instanciées directement. Le runtime va créer une instance du réal tapez dans les coulisses. Personnellement je pense que c'est un peu moche (et je ne peux pas trouver aucune référence à celle-ci dans la spécification C #) mais voilà.

Vous pouvez réellement faux ceci pour que le compilateur C # croira que votre interface est un type COM sans impliquer correctement COM ... voir ma question connexe pour plus de détails.


14
2018-05-20 14:58



Vous ne pouvez pas instancier un interface dans c # par définition et Application est ne pas un .NET régulier interface, mais une interface COM. De MSDN:

Il s'agit d'une interface .NET dérivée d'une coclasse COM requise   par code géré pour l'interopérabilité avec le COM correspondant   objet.

Maintenant, vous vous demandez probablement comment vous allez?

bien, quand le compilateur C # identifie un System.Runtime.InteropServices.CoClass attribut décore un interface, il utiliserait automatiquement Activator.CreateInstance sur le fourni type du CoClass propriété, par exemple:

[System.Runtime.InteropServices.CoClass(typeof(Test))] - Donc, une nouvelle instance de Test sera créé.


3
2018-05-20 14:59