2013-04-08 30 views
5

Trước hết, xin lỗi vì các lớp tên chung chung có tính chất excesive. Chủ nhân của tôi là hoang tưởng và tôi biết chắc chắn anh ta đi lang thang trang web này. Ok, vì vậy tôi có mã này:Gọi là lỗi mơ hồ khi sử dụng LINQ

var fooObj = new MyFooClass() 
{ 
    fooField1 = MyEnum.Value3, 
    fooField2 = false, 
    fooField3 = false, 
    fooField4 = otherEntity.OneCollection.ElementAt(0) as MyBarClass 
} 

nơi otherEntity.OneCollection là một ISet. ISet là một lớp sưu tập NHibernate triển khai IEnumerable. Nếu tôi cố gắng biên dịch mã này tôi nhận được lỗi này:

Error 2  The call is ambiguous between the following methods or properties: 
'System.Linq.Enumerable.ElementAt<MyFirm.Blah.Blah.ClassyClass> (System.Collections.Generic.IEnumerable<MyFirm.Blah.Blah.ClassyClass>, int)' 
and 
'System.Linq.Enumerable.ElementAt<MyFirm.Blah.Blah.ClassyClass>(System.Collections.Generic.IEnumerable<MyFirm.Blah.Blah.ClassyClass>, int)'  

Nhưng nếu tôi loại bỏ bằng cách sử dụng System.Linq vào đầu của lớp và thay đổi mã này:

var fooObj = new MyFooClass() 
{ 
    fooField1 = MyEnum.Value3, 
    fooField2 = false, 
    fooField3 = false, 
    fooField4 = System.Linq.Enumerable 
        .ElementAt(otherEntity.OneCollection, 0) as MyBarClass 
} 

nó biên dịch và làm việc. (? toán tử để kiểm tra xem OneCollection có xóa các phần tử vì mục đích rõ ràng)

Có ai giải thích lỗi này cho tôi không?

Trong trường hợp có liên quan: Tôi đang sử dụng Visual Studio 2008, nhắm mục tiêu .NET Framework 3.5 và sử dụng ReSharper 5.1.

LƯU Ý.- Chỉnh sửa để làm rõ cụ thể IEnumerable là bộ sưu tập, xin lỗi vì điều đó.

+0

Dường như bạn đã tham chiếu 2 phiên bản 'System.Linq.Enumerable ' –

+0

bạn đã tìm thấy giải pháp chưa? có vấn đề gì thế? Tôi thực sự tò mò vì đây là vấn đề khá phổ biến – quetzalcoatl

+0

Vâng. Tôi hoàn toàn không thể tìm thấy tham chiếu dư thừa của System.Linq.Enumerable, nhưng tôi có thể tiếp tục làm những gì tôi đề cập đến trong câu hỏi ban đầu, thay vì gọi ElementAt là một phương thức mở rộng, tôi gọi nó như một phương pháp bình thường sử dụng không gian tên đầy đủ, tức là: System.Linq.Enumerable.ElementAt (collection, index) thay vì collection.ElementAt (chỉ mục) đẹp hơn và dễ đọc hơn. – CMPerez

Trả lời

1

Để loại bỏ tham chiếu mơ hồ, bạn phải rõ ràng hơn. Có hai lựa chọn.

Thứ nhất, bạn có thể làm chung chung, như IEnumerable của bạn:

IEnumerable<MyFooClass> = new List<MyFooClass>(); 
... 
var fooObj = new MyFooClass() 
{ 
    fooField1 = MyEnum.Value3, 
    fooField2 = false, 
    fooField3 = false, 
    fooField4 = otherEntity.OneCollection.ElementAt(0) as MyBarClass 
} 

Hoặc thứ hai; nếu đó là một IEnumerable không chung chung, hãy thực hiện một dàn diễn viên:

IEnumerable = new List<MyFooClass>(); 
... 
var fooObj = new MyFooClass() 
{ 
    fooField1 = MyEnum.Value3, 
    fooField2 = false, 
    fooField3 = false, 
    fooField4 = otherEntity.OneCollection.Cast<MyFooClass>().ElementAt(0) 
} 
+0

Làm cách nào để trả lời câu hỏi? đã không nhận được nó ..Ông nói rằng "LINQ" chức năng không được xác định do cuộc gọi mơ hồ – ephraim

3

Điều này rất lạ.

Lỗi xác nhận rằng có sự mơ hồ giữa hai chữ ký hoàn toàn giống nhau.

Điều duy nhất tôi có thể nghĩ đến là bạn có thể bằng cách nào đó có 'tài liệu tham khảo' sai trong dự án của bạn và có thể bạn có nghĩa là tham chiếu cả 'System.Core 3.5' và 'System.Core 3.5.0.1' (ví dụ contrived) .. Bạn sẽ nhận được lỗi như vậy trong trường hợp này, nhưng chưa, tôi không thể nghĩ tại sao System.Linq.Enumerable.ElementAt(otherEntity.OneCollection hoạt động - nó nên báo cáo cùng một vấn đề.

.. hoặc có thể bạn bằng cách nào đó đã làm cho 'OneCollection' của bạn triển khai IEnumerable hai lần theo một số cách xấu xa? Nhưng sau đó, tôi nghĩ rằng thông báo lỗi sẽ khác nhau.

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