Referenz erforderlicher Fehler nur bei Verwendung von LINQ

9

Ich habe 3 C # Projekte / Baugruppen, A, B und C. B Referenzen A, C Referenzen B.

In A:

%Vor%

In B:

%Vor%

In C:

%Vor%

Dies alles wird kompiliert.

Wenn ich den Namespace System.Linq in Projekt C importiere und vor dem Aufruf von strings.Select(s => s); die Zeile client.M() (oder eine beliebige LINQ-Methode) hinzufüge, bekomme ich einen Compilerfehler:

  

Der Typ 'A.Dict' ist in einer Assembly definiert, auf die nicht verwiesen wird.   Sie müssen einen Verweis auf Assembly 'A, Version = 1.0.0.0 hinzufügen.   Kultur = neutral, PublicKeyToken = null '.

Wenn Extensions class internal erstellt oder in einen anderen Namespace verschoben wird, wird der Fehler verhindert.

Da B A umhüllen und seine Details vor C verstecken soll, ist es falsch, die Erweiterungsmethode öffentlich zu machen. Aber ich verstehe nicht, warum das nur vom Compiler ausgewählt wird, wenn LINQ hereingebracht wird.

Führt das Vorhandensein mindestens einer Erweiterungsmethode dazu, dass sich der Compiler etwas anders verhält?

    
Graham Clark 16.10.2015, 09:56
quelle

1 Antwort

2

Wenn Sie eine nicht aufgelöste Methode hinzufügen, wird dieser Fehler ausgelöst.

Ich kann mich nicht erinnern, wo ich das gelesen habe, aber der C # (VS2013) -Compiler hört auf, die Erweiterungsmethode aufzulösen, wenn er eine passende Nicht-Erweiterungsmethode findet. Sie können dies überprüfen, indem Sie den folgenden Code in Projekt C hinzufügen.

%Vor%

Es verursacht keinen Fehler!

Wenn eine Methode NICHT mit einer Nicht-Erweiterungsmethode aufgelöst wird (z. B. fügen Sie "abc".Foo() hinzu, um einen Compilerfehler zu verursachen), beginnt der C # -Compiler nun, die Erweiterungsmethoden zu prüfen. Wenn es B.Extensions.ToDict scannt, weiß es nicht, was Dict ist. Die Metadaten von Assembly B sagen jedoch Compiler von A.Dict , dann sehen Sie den Fehler.

    
qxg 16.10.2015, 11:30
quelle