myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » [gelöst] Fehlende Referenz für Überladene Methode die jedoch nicht aufgerufen wird (CompileError)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[gelöst] Fehlende Referenz für Überladene Methode die jedoch nicht aufgerufen wird (CompileError)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
rollerfreak2 rollerfreak2 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3271.jpg


Dabei seit: 14.07.2008
Beiträge: 893
Entwicklungsumgebung: VS2008 & VS2010


rollerfreak2 ist offline

[gelöst] Fehlende Referenz für Überladene Methode die jedoch nicht aufgerufen wird (CompileError)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi zusammen,

ich habe ein kleines Problem und versteh das Verhalten des .NET Compilers nicht ganz. Folgendes Szenario:

C#-Code:
//AssemblyB
public interface InterfaceB
{
    int Add(double a, double b);
}

C#-Code:
//AssemblyA
public interface InterfaceA
{
    int Add(int a, int b);

    int Add(InterfaceB b1, InterfaceB b2);
}

C#-Code:
//AssemblyC
static void Main(string[] args)
{
    object a = new object();
    InterfaceA b = (InterfaceA)a;
    b.Add((int)1, (int)2);
}

Der Code in Main macht zwar so keinen Sinn ich wollte nur das Problem darstellen. In AssemblyC habe ich natürlich nur eine Referenz auf die AssemblyA weil ich ja das Interface dort adressiere. Das Problem nur ist das eine Überladung der Methode existiert in der ein Interface aus AssemblyB verwendet wird. Das führt dazu das ich einen Compilerfehler bekomme.

Fehlermeldung:
The Type InterfaceB is defined in an assembly that is not referenced. You must add a reference to assembly AssemblyB.

Ich muss eine Referenz auf AssemblyB hinzufügen damit der Code compiliert obwohl ich keinen Typen dieses Assemblies direkt referenziere! Wieso erkennt der Compiler nicht die genaue Überladung bzw. wieso braucht er eine Referenz auf eine Überladung die ich im Code doch gar nicht referenziere?

Gibt es eventuell eine Lösung den Compiler zu übereden ohne eine Referenz auf AssemblyB hinzuzufügen und auch ohne die Signaturen zu ändern?

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von rollerfreak2 am 18.04.2012 10:04.

Neuer Beitrag 18.04.2012 08:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
talla talla ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3214.jpg


Dabei seit: 20.07.2003
Beiträge: 6.863
Entwicklungsumgebung: VS 2010
Herkunft: Esslingen


talla ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Assembly A wird von C geladen, sonst könntest du es ja nicht nutzen. Und A hat als Referenz B. Daher brauch C auch B über A. Da kannst du nichts ändern. Was für Methoden du im konkreten aufrufst ist egal, die Assemblies müssen immer komplett geladen werden.
Neuer Beitrag 18.04.2012 09:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
rollerfreak2 rollerfreak2 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3271.jpg


Dabei seit: 14.07.2008
Beiträge: 893
Entwicklungsumgebung: VS2008 & VS2010

Themenstarter Thema begonnen von rollerfreak2

rollerfreak2 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nein das ist falsch so wie du das sagst. Wenn ich im AssemblyA die Signature so ändere das es keine Überladung ist daher in

C#-Code:
//AssemblyA
public interface InterfaceA
{
    int Add(int a, int b);

    int Add1(InterfaceB b1, InterfaceB b2);
}

dann brauch ich in AssemblyC natürlich auch nur eine Referenz auf das AssemblyB weil ich in Main auf InterfaceB gar nicht zugreife. Bei der Überladung will der Compiler allerdings die Referenz haben obwohl ich die Signature mit InterfaceB nicht aufrufe!

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von rollerfreak2 am 18.04.2012 09:11.

Neuer Beitrag 18.04.2012 09:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
rollerfreak2 rollerfreak2 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3271.jpg


Dabei seit: 14.07.2008
Beiträge: 893
Entwicklungsumgebung: VS2008 & VS2010

Themenstarter Thema begonnen von rollerfreak2

rollerfreak2 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich habe eine Lösung gefunden wie man den Compiler überlisten kann. Das Zauberwort heißt Names Parameters.

Wenn man die Methode in der Main so called dann wird der Compiler gezwungen die Methode anhand der Parameter-Namen zu identifizieren. Die Referenz auf das AssemblyB ist dann nicht mehr nötig!

C#-Code:
//AssemblyC
static void Main(string[] args)
{
    object a = new object();
    InterfaceA b = (InterfaceA)a;
    b.Add(a : 1, b : 2);
}

Ein guter Artikel dazu ist  Named Parameters.
Neuer Beitrag 18.04.2012 09:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 47.474
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo rollerfreak2,

der Typ aus Assembly B taucht in der öffentlichen Schnittstelle der Assembly A auf. Selbst wenn du diesen Typen in Assembly C nicht benutzt, solltest du nach meinen Verständnis in C eine Referenz auf B hinzufügen.

Zum einen, weil es leicht passieren kann, dass eine vorher unbenutzte Methode später doch benutzt wird.

Zum anderen, weil es nicht nur statische, sondern auch dynamische Zugriffe geben kann (Reflection), und dann würde es zur Laufzeit knallen.

Oder du änderst den Code so, dass AssemblyC in sich abgeschlossen komplett ist, also alle Typen definiert, die als Parameter auftauchen.

herbivore
Neuer Beitrag 18.04.2012 13:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
rollerfreak2 rollerfreak2 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3271.jpg


Dabei seit: 14.07.2008
Beiträge: 893
Entwicklungsumgebung: VS2008 & VS2010

Themenstarter Thema begonnen von rollerfreak2

rollerfreak2 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo herbivore,

Zitat:
Selbst wenn du diesen Typen in Assembly C nicht benutzt, solltest du nach meinen Verständnis in C eine Referenz auf B hinzufügen.

Das sehe ich nicht so. Zur Laufzeit ist die AssemblyC im selben Ordner wie AssemblyA. Es ist ein sehr großes Projekt wo mehrere Assemblies nebeneinander liegen das heißt zur Laufzeit knallt es m.M.n. nicht auch wenn man mit Reflection dort ein Typ laden will.

Zitat:
Zum einen, weil es leicht passieren kann, dass eine vorher unbenutzte Methode später doch benutzt wird.

Wenn dieser Fall auftritt, dann muss der Entwickler sowieso die Referenz hinzufügen weil er sonst einen Compiler-Fehler bekommt. Ich sehe das nicht als Nachteil!
Neuer Beitrag 18.04.2012 15:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 19.05.2013 02:23