ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");
foreach(string s in x)
{
}
Điều đó có nghĩa là khi foreach chạy nó cố gắng truyền phần tử của danh sách mảng để nhập vào biểu thức foreach?Sử dụng foreach với ArrayList - đúc tự động?
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");
foreach(string s in x)
{
}
Điều đó có nghĩa là khi foreach chạy nó cố gắng truyền phần tử của danh sách mảng để nhập vào biểu thức foreach?Sử dụng foreach với ArrayList - đúc tự động?
Có, nếu phần tử không thể chuyển đổi thành loại, bạn sẽ nhận được InvalidCastException
. Trong trường hợp của bạn, bạn không thể đúc được đóng hộp int
đến string
gây ra ngoại lệ.
Về cơ bản, đó là tương đương với:
foreach (object __o in list) {
string s = (string)__o;
// loop body
}
Có tất nhiên khi bạn chạy vòng lặp đó và quăng nó với, trình biên dịch sẽ cố gắng đúc nó vào loại nhất định, mà trong trường hợp của bạn, nó sẽ là String . và nếu nó không thể làm điều đó nó sẽ tăng một InvalidCastException.
Theo C# specification của câu lệnh foreach, mã của bạn là tương đương với
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");
IEnumerator enumerator = (x).GetEnumerator();
try {
while (enumerator.MoveNext()) {
string element = (string)enumerator.Current; // here is casting occures
// loop body;
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Run mã và xem. – BoltClock
Tôi biết những gì nó làm, chỉ cần không chắc chắn liệu có nội bộ đúc từ đối tượng để loại quy định. – Lojol
Thật không may 'foreach' không ngầm đúc các phần tử của x vào loại được chỉ định cho biến vòng lặp ngay cả khi diễn viên thường rõ ràng. Một trong những điều xấu xí mà chúng ta được thừa kế từ thời đại tiền Generics. – CodesInChaos