2013-07-31 30 views
7

Tôi có hai câu hỏi:Thực hiện nội bộ AsEnumerable() trong LINQ

Câu hỏi 1 Bối cảnh: tôi nhận thấy khi nhìn vào việc thực hiện 'AsEnumerable()' phương pháp trong LINQ từ Microsoft, đó là:

public static IEnumerable<TSource> AsEnumerable<TSource>(this IEnumerable<TSource> source) 
{ 
    return source; 
} 

Câu hỏi 1: tôi đã chờ đợi một số loại đúc hoặc một cái gì đó ở đây, nhưng nó chỉ đơn giản trả về giá trị nó đã được thông qua. Cái này hoạt động ra sao ?

Câu hỏi 2/3 Bối cảnh: Tôi đã cố gắng hiểu Hiệp phương sai, contravariance và bất biến. Tôi nghĩ rằng, tôi có một sự hiểu biết mơ hồ rằng 'trong' và 'ra' từ khóa xác định hành vi đa hình khi gán một loại phụ cho một loại cha mẹ.

Câu hỏi 2: Tôi biết từ việc đọc mà IEnumerable là hiệp biến, và Danh mục là bất biến thì tại sao điều này không thể thực hiện:

List<char> content = "testString".AsEnumerable(); 

Câu hỏi 3:
Nếu IList thực hiện IEnumerable thì tại sao điều này là không thể:

IEnumerable<char> content1 = "testString"; 
IList<char> content2 = content1; 

Xin hãy giúp tôi hiểu, cảm ơn trong một dvance.

+0

AsEnumerable() buộc truy vấn để thực hiện ngay lập tức trong các nhà cung cấp LINQ khác như LINQ to SQL hoặc Entity Framework. Nó có thể được thêm vào LINQ to Objects cho đầy đủ. –

Trả lời

3
  1. Đối số đầu vào đã được biết là có loại IEnumerable<TSource>. Tại sao nó cần phải đúc bất cứ điều gì? Việc đưa các đối tượng vào loại TSource sẽ không có hiệu lực, vì chúng đã được đảm bảo là loại đó (hoặc loại có nguồn gốc nhiều hơn).

  2. Bạn không thể chỉ định giá trị loại IEnumerable<char> cho biến loại List<char>. Tôi nghĩ bạn đang suy nghĩ ngược lại ở đây; List<char> có nguồn gốc từ IEnumerable<char>, không phải theo cách khác. Điều này không liên quan gì đến việc List<T> là bất biến. IEnumerable<T> là hiệp biến (nói chính xác hơn, loại thông số T là hiệp biến), mà cho chúng ta tình trạng này:

    IEnumerable enumerable = Enumerable.Empty<string>(); // Allowed 
    IEnumerable<string> genericEnumerable = enumerable; // Not allowed 
    
  3. Một lần nữa, IList<char> thừa hưởng từ IEnumerable<char>, không phải là cách khác xung quanh. Bạn có thể làm điều này:

    IList<char> content1 = "testString".ToList(); 
    IEnumerable<char> content2 = content1; 
    

    Điều bạn đang yêu cầu không có ý nghĩa, tôi sợ và không liên quan gì đến hiệp phương sai. Thực tế là IEnumerable<T> là hiệp biến có nghĩa là bạn được phép làm điều này:

    IEnumerable<object> asObject = new List<string>() { "test" }; 
    

    Nhưng List<T> là bất biến, vì vậy bạn không thể làm điều này:

    List<object> asObject = new List<string>() { "test" }; 
    
+0

Tôi cần thời gian để tiêu hóa điều đó! – RaM

+0

Để trả lời câu trả lời thứ nhất, tôi hiểu, vì vậy Nếu tôi có thể gán trực tiếp một giá trị của đối tượng dẫn xuất cho một thể hiện của kiểu cha thì mục đích 'AsEnumerable()' có thể giải quyết được gì? – RaM

+0

Để trả lời câu trả lời thứ hai, Ok vậy Tại sao IEnumerable đếm được = (IEnumerable) Enumerable.Empty (); không thể ? IEnumerable thực hiện IEnumerable vậy tại sao trình biên dịch lại phàn nàn? – RaM

Các vấn đề liên quan