thể trùng lặp:
Foreach can throw an InvalidCastException?Tại sao trình biên dịch cho phép phiếu này?
Hãy xem xét các khối mã sau đây
public class Base
{
}
public class DerivedLeft : Base
{
}
public class DerivedRight : Base
{
}
class Program
{
static void Main(string[] args)
{
List<Base> list = new List<Base> { new DerivedLeft(), new DerivedRight() };
foreach (DerivedLeft dl in list)
{
Console.WriteLine(dl.ToString());
}
}
}
Thông báo các diễn viên từ cơ sở để DerivedLeft trong bản Tuyên Bố foreach. Điều này biên dịch tốt (Visual Studio 2010), mà không có bất kỳ lỗi hoặc thậm chí cảnh báo. Rõ ràng, trên vòng lặp thứ hai, chúng ta sẽ nhận được một InvalidCastException. Nếu tôi được hỏi một câu hỏi về phản ứng của trình biên dịch với mã như vậy, tôi sẽ không nghi ngờ gì, trình biên dịch đó sẽ không để điều này không được chú ý và tạo ra ít nhất một cảnh báo. Nhưng rõ ràng là không. Vì vậy, tại sao trình biên dịch cho phép điều này thông qua?
Tôi nghĩ rằng trình biên dịch không kiểm tra khởi .... ví dụ. nếu tôi đặt MyOtherClass ở đó để có một ngoại lệ thời gian biên dịch –
@RoyiNamir: Có, trình biên dịch sẽ kiểm tra nếu khởi tạo là chính xác, nhưng nó không kiểm tra xem các phần tử phù hợp có ở trong nó khi anh ta đạt đến vòng lặp foreach hay không. – Fischermaen
đúng ............ –