Chỉ cần tò mò, tại sao trình biên dịch xử lý một loại generic không bị ràng buộc nào khác với nó sẽ là typeof (đối tượng)?Các quy tắc của generics và các ràng buộc loại
class Bar { }
class Foo
{
void foo(object thing)
{
((Bar)thing).ToString();
}
}
class Foo<T>
{
void foo(T thing)
{
((Bar)thing).ToString();
}
}
Ở trên, truyền "T" tới Bar dẫn đến lỗi trình biên dịch. Đúc "đối tượng điều" để Bar tuy nhiên là một cái gì đó trình biên dịch cho phép tôi làm, tại nguy cơ của riêng tôi tất nhiên.
Điều tôi không thấy là lý do. Trong .net đối tượng sau khi tất cả là một catch-tất cả và thời gian chạy loại có thể là một giá trị đóng hộp hoặc một đối tượng của bất kỳ loại. Vì vậy, tôi không thấy lý do hợp lý có cho trình biên dịch để phân biệt giữa hai trường hợp. Điều tốt nhất tôi có thể làm là một cái gì đó như "lập trình viên mong đợi trình biên dịch kiểm tra kiểu với các kiểu generic, nhưng không phải với đối tượng". :) Có phải đó là tất cả để có nó?
Btw, Tôi biết rằng tôi vẫn có thể được dàn diễn viên của tôi được thực hiện trong trường hợp Foo, bằng cách đơn giản viết
((Bar)(object)thing).ToString();
Tôi chỉ muốn hiểu tại sao các trình biên dịch thực hiện điều này ...
Thời gian biên dịch có hợp pháp để bạn đưa 'int' vào' Bar' không? Khi bạn điền vào tham số kiểu đó với 'int', nên nó * sau đó * bắt đầu có lỗi trình biên dịch? Điều gì xảy ra nếu hội đồng không phải là của bạn, vì vậy bạn không thể nhìn thấy vấn đề? T không phải là đối tượng. Đó là một cái gì đó cực kỳ cụ thể. –
Bạn có biết rằng bạn có thể nói 'class Foo trong đó T: Bar' to _ensure_ mà' T' luôn có thể được truyền sang 'Bar'? –
Rawling
Tôi chắc rằng Eric Lippert có một bài đăng blog về điều này ở đâu đó, nhưng tôi không thể tìm thấy nó ... –