2009-07-24 13 views
9

qué puedo hacer esto:¿Por qué "como T" obtiene un error, pero fundición con (T) no se producirá un error?

public T GetMainContentItem<T>(string moduleKey, string itemKey) 
{ 
    return (T)GetMainContentItem(moduleKey, itemKey); 
} 

pero no esto:

public T GetMainContentItem<T>(string moduleKey, string itemKey) 
{ 
    return GetMainContentItem(moduleKey, itemKey) as T; 
} 

Se queja de que no he restringido el tipo genérico suficiente, pero entonces yo podría pensar que la regla se aplicaría a la fundición con "(T)" también.

Respuesta

23

Debido a 'T' podría ser un tipo de valor y 'como T' no tiene sentido para los tipos de valor. Puede hacer esto:

public T GetMainContentItem<T>(string moduleKey, string itemKey) 
    where T : class 
{ 
    return GetMainContentItem(moduleKey, itemKey) as T; 
} 
+0

Su respuesta es incorrecta, se puede lanzar sobre los tipos de valor, el resultado será anulable, ver este post y la respuesta de Jon Skeet: http://stackoverflow.com/questions/496096/casting-vs-using-the -as-keyword-in-the-clr – Mikhail

6

Si T es un tipo de valor esto es una excepción, es necesario asegurarse de que T es ya sea anulable o una clase.

1

¿Es T un tipo de valor? Si es así, si el operador as falla, devolverá null, que no puede ser almacenado en un tipo de valor.

0

Extendiéndose sobre la respuesta Yuriy Faktorovichs:

public T GetMainContentItem<T>(string moduleKey, string itemKey) where T: class 
{ 
    return GetMainContentItem(moduleKey, itemKey) as T; 
} 

Esto va a hacer el truco ...

0

Debido as T recupera null en caso de que no se puede echar a T en contraposición a (T) que se produce una excepción. Así que si no es TNullable o class no puede ser null ... creo.

Cuestiones relacionadas