xem xét giả tạo, ví dụ tầm thường này:Tại sao Linq Cast này thất bại khi sử dụng ToList?
var foo = new byte[] {246, 127};
var bar = foo.Cast<sbyte>();
var baz = new List<sbyte>();
foreach (var sb in bar)
{
baz.Add(sb);
}
foreach (var sb in baz)
{
Console.WriteLine(sb);
}
Với sự kỳ diệu của Complement Hai của, -10 và 127 được in ra cửa sổ Console. Càng xa càng tốt. Những người có đôi mắt sắc sảo sẽ thấy rằng tôi đang lặp lại trên một số đếm và thêm nó vào một danh sách. Điều đó nghe có vẻ như ToList
:
var foo = new byte[] {246, 127};
var bar = foo.Cast<sbyte>();
var baz = bar.ToList();
//Nothing to see here
foreach (var sb in baz)
{
Console.WriteLine(sb);
}
Ngoại trừ việc đó không hoạt động. Tôi nhận được ngoại lệ này: Loại
Ngoại lệ: System.ArrayTypeMismatchException
nhắn: Nguồn kiểu mảng không thể được gán cho loại mảng đích.
tôi thấy ngoại lệ này rất đặc biệt vì
ArrayTypeMismatchException
- Tôi không làm bất cứ điều gì với mảng, bản thân mình. Điều này có vẻ là một ngoại lệ nội bộ.Cast<sbyte>
hoạt động tốt (như trong ví dụ đầu tiên), đó là khi sử dụngToArray
hoặcToList
sự cố thể hiện chính nó.
Tôi đang nhắm mục tiêu .NET v4 x86, nhưng điều tương tự cũng xảy ra trong 3.5.
Tôi không cần bất kỳ lời khuyên nào về cách giải quyết vấn đề, tôi đã quản lý để làm điều đó. Điều tôi muốn biết là tại sao hành vi này lại xảy ra ngay từ đầu?
EDIT:
thậm chí lạ, thêm một lựa chọn công bố vô nghĩa làm cho ToList
để làm việc một cách chính xác:
var baz = bar.Select(x => x).ToList();
Với 'Chọn' kết quả là' {-10, 127} '. Có sự cố truyền ở đây. Thông báo lỗi thú vị chắc chắn. – asawyer
@Lieven yes, mà tôi thu thập được, bởi vì tại sao 'Select (x => x)' trước 'ToList' sửa nó? Đó là một phép chiếu vô nghĩa bởi vì điều tương tự được chiếu trở lại. – vcsjones
Tôi có một lời giải thích ... nó chỉ mất một chút thời gian để viết ra. Câu hỏi tuyệt vời. –