2013-04-08 11 views
5

Zunächst einmal, Entschuldigung für exzessive generische Klassen. Mein Arbeitgeber ist paranoid und ich weiß sicher, dass er diese Seite durchstreift. Ok, so habe ich diesen Code:Call ist mehrdeutiger Fehler mit Linq

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

wo otherEntity.OneCollection ein ISet ist. ISet ist eine NHibernate-Auflistungsklasse, die IEnumerable implementiert. Wenn ich versuche, diesen Code zu kompilieren, bekomme ich diesen Fehler:

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)'  

Aber wenn ich die Verwendung System.Linq am Anfang der Klasse entfernen und den Code dies ändern:

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

es kompiliert und funktioniert. (? Operator, um zu überprüfen, ob OneCollection Elemente aus Gründen der Übersichtlichkeit entfernt hat)

Konnte mir jemand diesen Fehler erklären?

Falls relevant: Ich verwende Visual Studio 2008, Targeting für .NET Framework 3.5 und die Verwendung von ReSharper 5.1.

HINWEIS.- Edited, um zu klären, welche konkrete IEnumerable ist die Sammlung, sorry dafür.

+0

Sie haben anscheinend 2 Versionen von 'System.Linq.Enumerable ' ' –

+0

referenziert haben Sie eine Lösung gefunden? Was war das Problem? Ich bin wirklich neugierig, denn das ist eher selten Problem – quetzalcoatl

+0

Ja. Ich konnte den redundanten Verweis von System.Linq.Enumerable nicht vollständig finden, aber ich konnte das tun, was ich in der ursprünglichen Frage erwähnt habe, anstatt ElementAt als eine Erweiterungsmethode aufzurufen, ich nenne es wie eine normale Methode, die es verwendet vollständiger Namespace, dh: System.Linq.Enumerable.ElementAt (collection, index) anstelle der viel netteren und lesbareren collection.ElementAt (index). – CMPerez

Antwort

1

Um die mehrdeutige Referenz zu entfernen, müssen Sie expliziter sein. Es gibt zwei Möglichkeiten.

Erstens könnten Sie Ihre IEnumerable generic machen, wie:

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

Oder Sekunde; Wenn es sich um ein nicht-generisches IEnumerable handelt:

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

Wie beantwortet das die Frage? habe es nicht verstanden ..Er sagte, dass "Linq" -Funktionen aufgrund eines mehrdeutigen Anrufs nicht identifiziert werden – ephraim

3

Das ist sehr seltsam.

Der Fehler behauptet, dass zwischen zwei völlig identischen Signaturen eine Zweideutigkeit besteht.

Das einzige, was mir einfällt, ist, dass Sie die "Referenzen" irgendwie in Ihrem Projekt durcheinander gebracht haben und dass Sie vielleicht entweder auf "System.Core 3.5" und "System.Core 3.5.0.1" verweisen. (künstliches Beispiel) .. Sie würden in diesem Fall einen solchen Fehler bekommen, aber dennoch kann ich nicht denken, warum System.Linq.Enumerable.ElementAt(otherEntity.OneCollection funktioniert - es sollte das gleiche Problem melden.

.. oder haben Sie Ihre OneCollection irgendwie dazu gebracht, das IEnumerable zweimal auf eine böse Art zu implementieren? Aber dann denke ich, die Fehlermeldung wäre anders.