2010-05-16 19 views
6

hace unas semanas un compañero de trabajo pasó aproximadamente dos horas descubriendo por qué esta pieza de código C++/CLI no se compilará con Visual Studio 2008 (acabo de probarlo con Visual Studio 2010 ... misma historia).La restricción de clase de valor de C++/CLI no se compilará. ¿Por qué?

public ref class Test 
{ 
    generic<class T> where T : value class 
     void MyMethod(Nullable<T> nullable) 
    { 

    } 
}; 

El compilador dice: Error

1 error C3214: 'T': tipo no válido argumento para el parámetro genérico 'T' de genérico 'Sistema :: anulable', no lo hace se reúnen restricción 'Sistema :: valueType ^' C: \ Users \ Simon \ Desktop \ Projektdokumentation \ GridLayoutPanel \ genéricos \ Generics.cpp 11 1 genéricos

Adición ValueType hará que el código se compile.

public ref class Test 
{ 
    generic<class T> where T : value class, ValueType 
     void MyMethod(Nullable<T> nullable) 
    { 

    } 
}; 

Mi pregunta es ahora. ¿Por qué? ¿Cuál es la diferencia entre value class y ValueType?

P.S: Véase la definición anulable para C++: http://msdn.microsoft.com/de-de/library/b3h38hb0.aspx

+0

Estoy de acuerdo, la restricción de clase de valor debería haber sido suficiente. Creo que tu solución es correcta. Puede probar connect.microsoft.com para ver qué dicen. –

Respuesta

5

I analizó el código IL de los tres métodos siguientes:

generic<class T> where T : value class, System::ValueType 
    static void MyMethod(T arg) 
{ 

} 

generic<typename T> where T: value class 
    static void MyMethod2(T arg) 
{ 

} 

generic<typename T> where T: ValueType 
    static void MyMethod3(T arg) 
{ 
} 

El correspondiente IL-código, que I dissassembled con NET-Reflector:

.method public hidebysig 
static void MyMethod<valuetype ([mscorlib]System.ValueType).ctor T> 
(!!T arg) cil managed 
{ 
} 


.method public hidebysig 
static void MyMethod2<valuetype .ctor T>(!!T arg) cil managed 
{ 
} 


.method public hidebysig 
static void MyMethod3<([mscorlib]System.ValueType) T>(!!T arg) cil managed 
{ 
} 

Esta es la IL-declaración de Nullable<T>:

.class public sequential ansi serializable sealed beforefieldinit 
Nullable<valuetype (System.ValueType) .ctor T> 
    extends System.ValueType 

Como se puede ver con claridad, sólo el la restricción del primer método coincide con el 100% con Nullable<T>. (Por cierto: value class parece implicar la presencia de un constructor estándar). Sin embargo, sigue siendo un misterio por qué el compilador produce diferentes códigos IL para (semánticamente) las mismas restricciones. Preguntaré a C++/CLI Gurus de Microsoft para más información.

0

ValueType es especial, ya que es la "clase base" de los tipos de valor, pero no un mismo tipo de valor. Este es probablemente el problema aquí.

Puede encontrar una buena lista de las diferentes entidades que utiliza el CLR en this excellent blog post.

Consulte también this y this thread para obtener más información específica del ValueType.

+0

Gracias por sus investigaciones, Lucero. – Simon

Cuestiones relacionadas