2011-01-12 4 views
1

Ich habe einige Schwierigkeiten mit einer überladenen Methode. Meine Signaturen wie folgt aussehen:Mehrdeutigkeit zwischen Methodenüberladungen mit String und EventHandler Parametern

void Register(object source, EventHandler mapped_handler) 
void Register(object source, string mapped_property) 

Ich versuche, die erste so zu nennen:

Register(someObject, (s, e) => { ... }); 

Visual Studio 2008 gibt mir error CS1503: Argument '2': cannot convert from 'System.EventHandler' to 'string'.

Was fehlt mir? Ich bin mir nicht sicher, wo das Problem liegt. Ich habe andere nicht überladene Methoden, die ich ohne Probleme EventHandler Lambdas übergeben kann.

+0

Dies sollte funktionieren. Streichen Sie Ihren Code so weit wie möglich ab, der das Problem noch reproduziert (eine Klasse, die diese zwei Überladungen mit trivialen Definitionen enthält, und ein 'Main', das versucht, die' Register (Objekt, EventHandler) Überladung) zu nennen und es hier und uns zu posten Ich werde sehen, was wir tun können. Wiederum ist es möglich, was Sie versuchen zu tun. – jason

Antwort

0

Danke für alle Antworten ... stellt sich heraus, dass es ein Problem in meinen Methodendeklarationen war. Ich hatte den Typ des ersten Parameters in meiner Methodensignatur falsch angegeben. Ich werde diese Frage für andere offenlassen, die dumme Fehler machen wie ich.

+1

Wenn Sie ein Problem mit der Kompilierung haben, entfernen Sie den Code so weit wie möglich, damit das Problem reproduziert werden kann. Wenn du das Problem nicht reproduzieren kannst, machst du irgendwo einen Fehler und hoffentlich wird es dir helfen, es zu finden (das hat sie gesagt). – jason

+0

@Jason Genau so habe ich das Problem gefunden. Danke für den Vorschlag. –

0

Sie tun müssen:

Register(someObject, new EventHandler((s,e)=>{...})); 
+0

Haben Sie eine Erklärung warum? –

+1

Nein, das tust du nicht. Das sollte funktionieren. – jason

+0

Jason hat Recht - Sie sollten das nicht tun müssen. Die Frage ist mehr als das, was uns gesagt wurde, vermute ich. –

2

, die absolut in Ordnung sein sollte. Kurz, aber vollständiges Beispiel:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     object o = new object(); 
     Register(o, (s, e) => {}); 
    } 

    static void Register(object source, EventHandler handler) 
    { 
     Console.WriteLine("Handler"); 
    } 

    static void Register(object source, string text) 
    { 
     Console.WriteLine("Text"); 
    } 
} 

Wenn Sie Ihre Frage mit einem ähnlich kurzen, aber vollständigem Beispiel aktualisieren konnten die nicht Arbeit, können wir in der Lage sein, weiter zu helfen. (Meine Vermutung ist, dass tatsächlich in dem Prozess mit einem kurzen, aber vollständigen Beispiel zu finden, das Problem finden.)

Die Tatsache, dass Ihre Fehlermeldung explizit über EventHandler spricht ist etwas verdächtig - weil der Typ Ihrer Argument ist nichtEventHandler, es ist nur ein Lambda-Ausdruck, der zu EventHandler konvertiert werden kann. Sind Sie sicher, dass der Fehler in der Anruferleitung auftritt?

+0

Könnte es einen Unterschied in der Überladungsauflösung zwischen C# -Versionen geben? –

+0

@Anthony Pegram: Nein. Dies ist definitiv in .NET 3.5 und Visual Studio 2008 möglich. – jason

+0

@Anthony: Ich habe es mit dem "Visual C# 2008" Compiler sowie die neuere versucht.Zugegeben, es ist SP1, aber ich würde nicht erwarten, dass das hier einen Unterschied macht. Es gibt keine Konvertierung von einem Lambda-Ausdruck in eine Zeichenfolge, daher sollte diese Methode nicht Teil des Kandidatensatzes sein. –

Verwandte Themen