2011-12-20 60 views
9

Bắt một InvalidCastException khi cố gắng một cái gì đó như thế này:Không thể chuyển đổi Danh sách <KeyValuePair <...,...>> thành IEnumerable <object>?

IEnumerable<object> test = (IEnumerable<object>)new List<KeyValuePair<string, int>>(); 

Tuy nhiên, điều này đã làm công việc:

IEnumerable<object> test = (IEnumerable<object>)new List<Dictionary<string, int>>(); 

Vì vậy, sự khác biệt lớn là gì? Tại sao một KeyValuePair không được chuyển đổi thành một đối tượng?

Cập nhật: Tôi có lẽ nên chỉ ra rằng điều này đã làm công việc:

object test = (object)KeyValuePair<string,string>; 

Trả lời

17

Đó là bởi vì KeyValuePair<K,V> không phải là một lớp học, là một cấu trúc. Để chuyển đổi danh sách để IEnumerable<object> có nghĩa là bạn phải đi từng cặp khóa-giá trị và hộp nó:

IEnumerable<object> test = new List<KeyValuePair<string, int>>().Select(k => (object)k).ToList(); 

Như bạn phải chuyển đổi mỗi mục trong danh sách, bạn không thể làm điều này bằng cách đơn giản đúc các tự liệt kê.

2

A KeyValuePair là cấu trúc và không kế thừa từ đối tượng lớp.

3

Trước hết từ điển đã là bộ sưu tập của KeyValuePairs, do đó ví dụ thứ hai là truyền toàn bộ từ điển sang đối tượng, chứ không phải KeyValuePairs.

Dù sao, nếu bạn muốn sử dụng danh sách, bạn cần phải sử dụng phương pháp Cast để chuyển đổi cơ cấu KeyValuePair thành một đối tượng:

IEnumerable<object> test = (IEnumerable<object>)new List<KeyValuePair<string, int>>().Cast<object>(); 
Các vấn đề liên quan