Tôi có một tình huống mà tôi muốn hành vi của trình biên dịch được giải thích. Với một mã nhỏ:Từ khóa kín ảnh hưởng đến ý kiến của trình biên dịch trên một diễn viên
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
Các biên dịch và chạy sau:
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
Nếu chúng ta thực hiện thay đổi chữ ký của lớp Foo
và thêm sealed
keyword:
sealed class FooGetter : IFoo<int> // etc
Sau đó, tôi gặp lỗi trình biên dịch trên dòng sau:
return (IFoo<T>)new FooGetter();
Trong:
Không thể chuyển đổi loại 'MyNamespace.FooGetter' thành 'MyNamespace.IFoo <T>'
Ai đó có thể giải thích những gì đang xảy ra ở đây liên quan đến từ khóa sealed
? Đây là C# 4 chống lại một dự án .NET 4 trong Visual Studio 2010.
Cập nhật: thú vị đủ Tôi vấp vào một phần của hành vi đó khi tôi đã tự hỏi tại sao đoạn mã sau sửa chữa nó khi sealed
được áp dụng:
return (IFoo<T>)(IFoo<int>)new FooGetter();
cập nhật: chỉ cần làm rõ, tất cả chạy tốt khi loại T
yêu cầu cũng giống như các loại T
sử dụng bởi các loại bê tông. Nếu các loại khác nhau, các diễn viên thất bại trong thời gian chạy với một cái gì đó như:
Không thể cast đối tượng của loại 'MyNamespace.StringFoo' gõ 'MyNamespace.IFoo`1 [System.Int32]
Trong ví dụ trên, StringFoo : IFoo<string>
và người gọi yêu cầu nhận int
.
Tôi không có câu trả lời, nhưng tôi sẽ tưởng tượng rằng nó có cái gì để làm với thực tế rằng 'IFoo' là một kiểu generic mở trong khi 'dụng cụ FooGetter' 'IFoo ' là loại chung đóng. –
Chỉ cần lưu ý: Tôi đã chắc chắn rằng mình đã có hành vi được xác định trước khi đăng câu hỏi - không muốn tự lừa dối mình :-) Tôi có thể thấy lý do tại sao nó có thể được cho phép, trình biên dịch không thể đảm bảo những gì đang diễn ra chỉ biết rằng nó có cơ hội thành công. Nhưng vì một lý do nào đó, nó loại bỏ cơ hội thành công tương tự khi từ khóa được niêm phong hiện diện do nó giả định rằng vì nó không thể được bắt nguồn, nó không thể khớp với T. –
+1 Thú vị :) – leppie