Nếu tôi thử một diễn viên không hợp lệ từ một lớp đến một giao diện, thì trình biên dịch không phàn nàn (lỗi xảy ra khi chạy); Tuy nhiên, nó không có khiếu nại, nếu tôi thử một diễn viên tương tự với một lớp trừu tượng.Tại sao không có lỗi trình biên dịch khi tôi truyền một lớp tới giao diện mà nó không thực hiện?
class Program
{
abstract class aBaz
{
public abstract int A { get; }
}
interface IBar
{
int B { get; }
}
class Foo
{
public int C { get; }
}
static void Main()
{
Foo foo = new Foo();
// compiler error, as expected, since Foo doesn't inherit aBaz
aBaz baz = (aBaz)foo;
// no compiler error, even though Foo doesn't implement IBar
IBar bar = (IBar)foo;
}
}
Tại sao không trình biên dịch từ chối các diễn viên từ Foo-Ibar, khi nó (có vẻ?) Không hợp lệ? Hoặc, để lật câu hỏi, nếu trình biên dịch cho phép diễn viên "không hợp lệ" này giao diện IBar, tại sao nó không cho phép diễn viên "không hợp lệ" tương tự vào lớp trừu tượng aBaz?
http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – SLaks
Điều này truyền đến một giao diện bit tôi trong mông tối nay ... và cậu bé đã làm đau. –
Bạn không đánh dấu 'Foo' là' niêm phong'. Vì vậy, các diễn viên rõ ràng sẽ biên dịch. Có thể tồn tại một lớp kế thừa từ 'Foo' được bổ sung thêm' IBar'. Nếu bạn sử dụng 'lớp Foo' bị đóng kín, thì phép đúc thành' IBar' sẽ là bất hợp pháp tại thời gian biên dịch. (Trong trường hợp này, lớp 'Foo' được lồng riêng, vì vậy ngay cả khi diễn viên phải được cho phép, có thể hiểu rằng trình biên dịch C# có thể đưa ra một _warning_ (không phải lỗi kể từ khi thông số nói rõ ràng tồn tại) vì nó có thể thấy phạm vi đầy đủ của lớp lồng nhau. Nhưng đó có thể là trường hợp hiếm hoi.) _Edit: _ Bây giờ tôi thấy điều này được Alexei bảo hiểm bên dưới. –