Các foreach
vòng lặp có một diễn viên tiềm ẩn trong đó. Nó đại khái như thế này:
using (IEnumerator<Test> iterator = list.GetEnumerator())
{
while (iterator.MoveNext())
{
IDisposable item = (IDisposable) iterator.Current;
// Body of foreach loop here
}
}
Quay trở lại trước thế hệ, điều đó thuận tiện hơn nhiều so với việc phải sử dụng mã nguồn. Bây giờ nó không quá quan trọng, nhưng sẽ thật kỳ lạ khi nó không được biên dịch. Lưu ý rằng trình biên dịch sẽ kiểm tra rằng ít nhất là khả thi . Nếu bạn sử dụng foreach (string item in list)
nó sẽ không biên dịch, bởi vì Test
không thể là một string
- nhưng Test
có thể là một IDisposable
, bởi vì nó có thể đề cập đến một thể hiện của một lớp con của Test
việc thực hiện đó IDisposable
. Nếu bạn làm cho Test
lớp bị niêm phong, nó cũng sẽ không biên dịch ngay cả với IDisposable
, bởi vì sau đó một Test
thể hiện không thể thực hiện IDisposable
.
Về cơ bản, nó sẽ biên dịch nếu một kiểu đúc từ Test
loại lặp sẽ biên dịch và sẽ không biên dịch theo cách khác. Nhưng nó sẽ thất bại tại thời gian thực hiện nếu một diễn viên bình thường cũng thất bại tại thời điểm thực hiện.
Test
đó làm thực hiệnIDisposable
. Hiệu quả là foreach cố gắng truyền mọi phần tử vào giao diện và ném ngoại lệ nếu điều này không thành công. Giống như nếu bạn viếtd(IDisposable)currentElement
. Tuy nhiên tôi có thể thấy được tại sao nó không nên biên dịch trên lớp cụ thể.