Paramètres optionnels dans le C++/CLI méthodes

Comment puis-je déclarer une méthode gérée en C++/CLI qui est un paramètre facultatif lorsque utilisée en C#?

J'ai décoré le paramètre à la fois d'une En option et un DefaultParameterValue attribut (voir: Comment les valeurs par défaut des paramètres sont codés), mais seulement l'attribut Facultatif semble être à l'honneur.


C++/CLI:

public ref class MyClass1
{
 public:
  MyClass1([System::Runtime::InteropServices::Optional]
           [System::Runtime::InteropServices::DefaultParameterValue(2)]
           int myParam1)                                            
  {
    System::Console::WriteLine(myParam1);
  }
};

C#:

var myInstance1 = new MyClass1();  //compiles and runs

Sortie:

0

Résultat Attendu:

2

Visual C# IntelliSense:

MyClass1.MyClass1([int myParam1 = 0]);  //wrong default value
                                  

Edit: regarder de plus près, avec un désassembleur révèle que le C++/CLI compilateur n'a en effet pas à produire les .param [1] = int32(2) directive. Le IL code indiqué par le Réflecteur est faux.

Réflecteur:

.method public hidebysig specialname rtspecialname instance void .ctor([opt] int32 myParam1) cil managed
{
    .param [1] = int32(2)  //bug
    ...

ILDASM:

.method public hidebysig specialname rtspecialname instance void .ctor([opt] int32 myParam1) cil managed
{
    .param [1]
    .custom instance void [System]System.Runtime.InteropServices.DefaultParameterValueAttribute::.ctor(object) = ( 01 00 08 02 00 00 00 00 00 ) 
    ...
  • Pourquoi est-ce qu'une surcharge de ne pas travailler, à vos fins?
  • P: Juste des raisons esthétiques. Je vais faire des surcharges quand je ne peux pas obtenir que cela fonctionne, mais je préfère les paramètres facultatifs, si possible.
InformationsquelleAutor dtb | 2011-02-11