2009-07-24 35 views
9

Tại sao tôi có thể làm điều này:Tại sao "như T" gặp lỗi nhưng truyền với (T) không nhận được lỗi?

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

nhưng không này:

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

Nó phàn nàn rằng tôi đã không bị hạn chế kiểu generic đủ, nhưng sau đó tôi sẽ nghĩ rằng quy tắc sẽ được áp dụng để đúc với "(T)" là tốt.

Trả lời

23

Vì 'T' có thể là loại giá trị và 'làm T' không có ý nghĩa đối với các loại giá trị. Bạn có thể làm điều này:

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

Câu trả lời của bạn không chính xác, bạn có thể truyền theo kiểu giá trị, kết quả sẽ không thể xem được, xem bài đăng này và câu trả lời của Jon Skeet: http://stackoverflow.com/questions/496096/casting-vs-using-the -as-keyword-in-the-clr – Mikhail

6

Nếu T là một loại giá trị thì đây là một ngoại lệ, bạn cần đảm bảo T là Nullable hoặc một lớp.

1

Có phải là T loại giá trị? Nếu vậy, nếu toán tử as không thành công, nó sẽ trả lại null, không thể lưu trữ trong một loại giá trị.

0

Mở rộng trên Yuriy Faktorovichs câu trả lời:

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

này sẽ làm các trick ...

0

as T lấy null trong trường hợp đó nó không thể đúc để T như trái ngược với (T) đó ném một ngoại lệ. Vì vậy, nếu T không phải là Nullable hoặc class thì không thể là null ... tôi nghĩ vậy.

Các vấn đề liên quan