2009-07-24 3 views
9

Warum kann ich dies tun:Warum erhält "as T" einen Fehler, aber ein Casting mit (T) keinen Fehler?

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

aber nicht so:

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

Es beschwert sich, dass ich nicht der generische Typ genug eingeschränkt haben, aber dann würde ich denken, dass Regel Gießen gelten würde mit "(T)" auch.

Antwort

23

Weil 'T' ein Werttyp sein kann und 'wie T' für Werttypen keinen Sinn ergibt. Sie können dies tun:

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

Ihre Antwort ist falsch, Sie können Werttypen umwandeln, das Ergebnis wird Nullable sein, siehe diesen Beitrag und die Antwort von Jon Skeet: http://stackoverflow.com/questions/496096/casting-vs-using-the -als-Stichwort-in-der-Clr – Mikhail

6

Wenn T ein Werttyp ist, ist dies eine Ausnahme. Sie müssen sicherstellen, dass T entweder Nullable oder eine Klasse ist.

1

Ist T ein Werttyp? Wenn dies der Fall ist, gibt der Operator as einen Fehler aus und gibt null zurück, die nicht in einem Werttyp gespeichert werden können.

0

Erweiterung auf Yuriy Faktorovichs Antwort:

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

Dies wird den Trick ...

0

Da as Tnull im Fall ruft, dass es nicht zu T-(T) im Gegensatz werfen kann, die eine Ausnahme auslöst. Also wenn T nicht Nullable oder class ist, kann es nicht null sein ... ich denke.

Verwandte Themen