2016-05-10 7 views
1

Mein Code kompiliert perfekt, bis ich eine neue Referenz zu meinem Projekt hinzugefügt. Telerik.Windows.Controls.ScheduleViewMehrdeutiger Aufruf von Drittanbieter-Referenz

Sobald ich die Referenz hinzugefügt, der Fehler ambiguous invocation hat begonnen, Dictionary Key Value Pairs zu erscheinen.

Der Anruf ist zweideutig zwischen den folgenden Methoden oder Eigenschaften:

‚Telerik.Windows.Diagrams.Core.CommonExtensions.AddRange < System.Collections.Generic.KeyValuePair < string, Objekt > > (System. Collections.Generic.ICollection < System.Collections.Generic.KeyValuePair < Zeichenfolge, Objekt > >, System.Collections.Generic.IEnumerable < System.Collections.Generic.KeyValuePair < Zeichenfolge, Objekt > >) '

und

' Telerik.Windows.Controls.CollectionExtensions.AddRange < System.Collections.Generic.KeyValuePair < string, Objekt > > (System.Collections.Generic.ICollection < System.Collections.Generic .KeyValuePair < string, Objekt > >, System.Collections.Generic.IEnumerable < System.Collections.Generic.KeyValuePair < Zeichenfolge, Objekt > >)‘

Darf ich fragen, wie ich den mehrdeutigen Aufruf für Referenzen von Drittanbietern auflösen kann.

Mein aktueller Code

var selectedTargetGroups = new Dictionary<string, object>(); 
selectedTargetGroups.AddRange(TargetGroups.Where(x => (int) x.Value == current.TargetGroupList.Id)); 

Ein Weg, um dies war .Add statt AddRange zu verwenden. Aber jede andere Alternative wäre eine große Hilfe.

+0

'Dictionary' Typ auch definiert in der erwähnten' Telerik.Windows.Controls.ScheduleView' –

+0

Ich dachte, dass viel. Aber wie kann ich angeben, welches Wörterbuch verwendet werden soll? – Master

+0

Versuchen Sie diesen Namensraum: 'System.Collections.Generic.Dictionary' –

Antwort

1

Es gibt keine einfache Möglichkeit, dies zu tun. Wenn zwei Erweiterungsmethoden mit gleichen Signaturen im Geltungsbereich sind, gibt es keine Möglichkeit, zwischen ihnen zu unterscheiden, ohne explizit anzugeben, welche Implementierung mit der Nicht-Extension-Syntax gewünscht wird. In Ihrem Beispiel:

var selectedTargetGroups = new Dictionary<string, object>(); 
CollectionExtensions.AddRange(
    selectedTargetGroups, 
    TargetGroups.Where(x => (int) x.Value == current.TargetGroupList.Id) 
); 

Abgesehen von hässlich zu sein und den Namen der Klasse Aussetzen des Erweiterungsmethode Hosting (die Änderungen vorbehalten sein könnte), ist dies auch nicht gut, wenn Sie eine Menge vorhandenen Code haben Sie don Ich will diesen Weg nicht ändern.

Eine andere Problemumgehung besteht darin, sicherzustellen, dass der Typ, der die gewünschte Erweiterungsmethode enthält, nicht im Bereich ist. Also anstatt

using Telerik.Windows.Controls; 
using Telerik.Windows.Diagrams.Core; 

Formulieren über die Arten Schreiben Sie unter Verwendung eines Alias ​​wollen:

using ScheduleView = Telerik.Windows.Controls.ScheduleView; 
using Telerik.Windows.Diagrams.Core; 

Offensichtlich kann diese Abhilfe sehr umständlich, wenn Sie alle (oder fast alle) Typen wollen in ein Namespace. Beachten Sie, dass es nicht möglich ist, Erweiterungs-Methoden zu disambiguieren, indem Sie Aliase für die Klassen einführen, die sie enthalten: Erweiterungsmethoden für Alias-Typen werden nicht als Erweiterungsmethoden angezeigt.(Sie nicht entweder verschwinden entweder, so können Sie nicht unerwünschte Erweiterung Methoden auf diese Weise.)

Die beste Lösung ist, um sicherzustellen, dass dies nicht geschieht, aber dies erfordert die Zusammenarbeit von Bibliotheksautoren. Es ist definitiv ein Fehler, eine öffentlich zugängliche Erweiterungsmethode für einen Typ so allgemein wie ICollection in einer Bibliothek zu definieren, da dies nur zu Konflikten führt. Erweiterungsmethoden sollten nur für Typen definiert werden, die die Bibliothek definiert, oder sie sollten in der Bibliothek internal bleiben oder sie sollten Teil eines eigenen Namensraums sein, in dem sie für den selektiven Import verfügbar sind. Dies ist jedoch keine Hilfe für die Verbraucher von Bibliotheken, die es falsch verstehen.

+0

Vielen Dank für die ausführliche Antwort. Ich war so verwirrt darüber, wie man die CollectionExtensions-Methode verwendet – Master

Verwandte Themen