2010-04-07 19 views
10

Saludos a todos. Lo siento, si esto ya se preguntó antes (buscó en vano) o es realmente muy simple, pero simplemente no puedo obtenerlo. El MSDN definition de un tipo anulable, estados, que se define de manera siguiente:Confusión sobre Nullable <T> restricciones

[SerializableAttribute] 
public struct Nullable<T> 
where T : struct, new() 

Así que la pregunta es muy sencilla: ¿Cómo es posible esta definición? O esto es solo un error tipográfico? Cada tipo de valor ya tiene un constructor predeterminado. De hecho, cuando intento compilar algo como esto, el compilador dice razonablemente que es ilegal aplicar ambas restricciones al mismo tiempo, porque el segundo está implícitamente incluido en el primero.

Gracias de antemano.

Respuesta

12

Creo que es solo un error en la documentación. Si observa el tipo Nullable<T> en Reflector o utiliza el comando "Ir a definición" en VS, muestra solo la restricción struct.


EDITAR

estaba pensando de nuevo en eso, y lo hice una pequeña prueba:

var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes; 
Console.WriteLine(attributes); 

Este código genera el siguiente resultado:

NotNullableValueTypeConstraint, DefaultConstructorConstraint

Así que de acuerdo a la reflexión, la T en Nullable<T>hace tienen la restricción new() ... Lo que significa que a pesar de que es válida en C#, que debe ser válido para el CLR.

Así que la documentación es a la vez bueno y lo malo: es cierto que el T en Nullable<T> tiene la restricción "constructor por defecto", pero el C# declaración que muestra es incorrecto ...

Esto no es realmente muy sorprendente, ya que la documentación se genera a partir de los metadatos del ensamblado (y los comentarios XML, por supuesto). Tiene que haber un error en el generador de documentación ...

3

Si nos fijamos en el desmontaje IL, se puede ver que tiene una restricción de constructor:

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

Si la documentación se genera directamente desde el metadatos de ensamblaje, tal vez esta es la causa?

5

C# requiere que los tipos de valor tengan constructores públicos predeterminados, pero el CLR no lo hace.

Si definió un tipo en un lenguaje que admite una definición de estructura de este tipo (creo que C++/CLI lo permite), habría ambigüedad en cuanto a cuándo se llama.

Cuestiones relacionadas