2009-03-01 26 views
7

Me he enfrentado a mucha confusión con respecto a la diferencia del tipo de referencia genérico frente al tipo de valor genérico durante mi codificación API.Genéricos C#: tipo de referencia vs. valor

Guys, la pregunta es ¿cuáles son las diferencias en lo que respecta a las limitaciones y las funcionalidades (fácilmente pasados ​​por alto los/más importantes) entre estas dos bestias:

class ReferenceGeneric <T> where ??? 
{ 

} 

y

struct ValueGeneric <T>: where ??? 
{ 


} 

Editar Solo para aclarar la pregunta y lo que busco: quiero saber qué puede hacer con los tipos de referencia genéricos Y no puede hacer con los tipos de valores genéricos ... y viceversa

Editar # 2 Otras aclaraciones: ¿Cómo se puede restringir T si el tipo genérico es referencia o tipo de valor? ¿Existen diferencias en cuanto a cómo se puede restringir cada tipo?

+0

Tu pregunta es muy conf usando ... hay una respuesta por ahí, pero ¿qué estás buscando? – andleer

+0

dijiste que tienes que modificar algunas veces. ¿Puede dar un ejemplo? –

+0

He elaborado sobre la cuestión en la edición. –

Respuesta

13

Tenga en cuenta que cualquier cosa declarada como una estructura es siempre un tipo de valor, y cualquier cosa que declara como una clase es siempre un tipo de referencia. En otras palabras, List<int> sigue siendo un tipo de referencia, y si tenía:

struct Foo<T> 
{ 
    T value; 
} 

continuación Foo<string> todavía habría un tipo de valor.

En cuanto a lo que puede haga con los tipos genéricos - realmente solo siguen las reglas normales para tipos de valores y tipos de referencia; en cuanto a lo que puede hacer con un valor de tipo Tdentro de el tipo, que depende de si/cómo T está restringido. No varía en función de si el tipo genérico en sí mismo es una estructura o una clase.

EDITAR: Sasha menciona Nullable<T> en los comentarios. No estoy seguro de lo que significa "excepción" aquí - que no sea Nullable<T> no cumple la restricción "where T : struct" o "where T : class". Sin embargo, sigue siendo un tipo de valor (que es parte del punto).

+0

Jon, hay una excepción si el tipo de estructura es Nullable. ¿Podrías elaborar sobre eso también? thx –

+0

gracias por la elaboración ... –

+0

"todo lo que se declara como clase es siempre un tipo de valor" error tipográfico? – ShuggyCoUk

8

En respuesta a Edit2: Puede limitar los tipos permitidos para hacer referencia o valor de por lo siguiente:

Referencia:

class ReferenceGeneric <T> where T: class 
{ 

} 

Valor:

struct ValueGeneric <T> where T: struct 
{ 


} 

A partir de la siguiente página en MSDN http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

¿Puede limitar estructura por clase: struct ValueGeneric donde T: Clase { } –

Cuestiones relacionadas