2010-06-22 10 views
5
public class x : y 
{  

public Func<user, bool> SendStuffAction = SendStuff; 

//overridden from y 
public override bool SendStuff(user u) 
{ 
    //do stuff 
} 

} 

den obigen Code machen, wo SendStuff eine lokale Instanz überschriebene Methode ist, erhalte ich einen Kontextfehler, dass SendStuff nicht statisch zu sein. Kann ein Delegat nicht auf eine Instanzmethode innerhalb derselben Klasse zeigen, für die die Methode SendStuff existiert?Mit Func mit Instanz-Methode

Fehler sind: kann nicht statische Methode Zugriff in einem nicht-statischen Kontext

Was passiert, wenn die Methode privat ist, warum sollte es dann nicht funktionieren.

+1

Post mehr Code. dieses Stück sieht gut aus – Andrey

+1

kann jemand erklären, warum SendStuffAction als statisch behandelt wird? – SWeko

+1

Wenn Sie eine Methode als Feldinitialisierer verwenden, muss es immer eine statische Methode sein. Es gibt keine Möglichkeit zu garantieren, dass die Instanz in einem konsistenten Zustand ist, bevor die Felder initialisiert werden, so dass Instanzmethoden nicht erlaubt sind. – Toby

Antwort

7

Ja, es kann ... aber Sie müssen es im Konstruktor festlegen, wenn Sie nicht als statisch deklarieren.

class MyClass 
{ 
    public Func<loan, user, bool> SendStuffAction ; 

    MyClass() 
    { 
     SendStuffAction = SendStuff; 
    } 

    bool SendStuff(loan loanVar, user userVar) 
    { 
     return true; 
    } 
} 
+0

Danke, aber kannst du ein wenig mehr erklären, warum das so ist? –

+0

[+1 interessant, hatte dies nicht erkannt] (http://stackoverflow.com/questions/923343/c-error-class-delegate-field-initializer-cannot-reference-the-non-static). Wie Toby in den obigen Kommentaren der Hauptfrage erwähnt, öffnet die Verwendung eines nicht-statischen Members in einem Feldinitialisierer, um es anderweitig zu verwenden, während sich die zu konstruierende Instanz in einem unbekannten Zustand befindet (Initialisierer werden in unbekannter Reihenfolge ausgeführt). Sie dürfen dies im Konstruktor tun, da Feldinitialisierer beendet wurden und Sie die Kontrolle über die Reihenfolge der verbleibenden Initialisierung haben, obwohl Sie immer noch vorsichtig sein müssen. – shambulator

Verwandte Themen