2009-07-24 10 views
9

Perché non posso fare questo:Perché "come T" riceve un errore ma il casting con (T) non riceve un errore?

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

ma non questa:

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

Si lamenta che non ho ristretto il tipo generico abbastanza, ma poi mi potrebbe pensare che regola si applicherebbe alla fusione con "(T)" pure.

risposta

23

Perché "T" potrebbe essere un tipo di valore e "come T" non ha senso per i tipi di valore. È possibile effettuare ciò:

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

La tua risposta è errata, puoi trasmettere i tipi di valore, il risultato sarà annullabile, vedi questo post e la risposta di Jon Skeet: http://stackoverflow.com/questions/496096/casting-vs-using-the -come-parola chiave-in-the-clr – Mikhail

6

Se T è un tipo di valore, questa è un'eccezione, è necessario assicurarsi che T sia Nullable o una classe.

1

È T un tipo di valore? In tal caso, se l'operatore as non riesce, restituirà null, che non può essere memorizzato in un tipo di valore.

0

Estendendosi su Yuriy Faktorovichs risposta:

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

Questo farà il trucco ...

0

Perché as T recupera null nel caso in cui esso non può lanciare a T al contrario di (T) che genera un'eccezione. Quindi se T non è Nullable o class non può essere null ... penso.

Problemi correlati