Ich habe die folgende Klasse in C ++ / CLI und eine explizite Template-Instanziierung für das int-Primitiv ..
%Vor% Beim Kompilieren und Überprüfen der generierten Assembly mit Reflector kann ich eine Klasse mit dem Namen Number<int>
sehen, aber beim Versuch, diese Klasse in C # zu instanziieren, beschwert sich der Compiler über eine System::Number
-Klasse, die kein Template-Argument verwendet. Was mache ich falsch? Kann das überhaupt gemacht werden?
Ich habe ein Problem damit, eine zusätzliche Klasse zu deklarieren, die die Klasse Number<int>
erbt. Diese Klasse ist jetzt in C # sichtbar und kann instanziiert werden.
Reflektor ist liegend hier ein wenig. Der Name der Klasse ist nicht tatsächlich Number & lt; int & gt ;. Es ist tatsächlich 'Nummer & lt; int & gt;'. Beachten Sie die einfachen Anführungszeichen. Diese sind nur sichtbar, wenn Sie den Typnamen mit ildasm anzeigen.
Ich glaube, dass dies getan wird, um den Typ in den meisten Sprachen unbindbar zu machen, da sie nicht verstehen können, wie eine C ++ - Vorlage tatsächlich funktioniert. Dies macht es effektiv nur sichtbar für den C ++ - Compiler, der geeignet ist, da es der einzige MS-Compiler ist, der tatsächlich Vorlagen unterstützt (Templates! = Generics).
Wenn Sie in C ++ - CLI einen parametrisierten Typ erstellen und diesen Typ dann aus C # verwenden möchten, müssen Sie einen generischen Typ anstelle eines Vorlagentyps erstellen (siehe Stan Lippmans Blog für die Gründe, warum beide Methoden existieren). Informationen zum Erstellen generischer Typen in C ++ CLI finden Sie hier .