2013-02-14 10 views
22

Ich habe eine Klasse mit dem Namen Pin.C# kann die Methode nicht in einen Nicht-Delegattyp konvertieren

public class Pin 
{ 
    private string title; 

    public Pin() { } 

    public setTitle(string title) { 
     this.title = title; 
    } 
    public String getTitle() 
    { 
     return title; 
    } 
} 

Aus einer anderen Klasse hinzufügen I Pins Objekte in einem List<Pin> Stifte und von einem anderen möchte ich die Liste Pins iterieren und die Elemente zu erhalten. Also ich habe diesen Code.

foreach (Pin obj in ClassListPin.pins) 
{ 
    string t = obj.getTitle; 
} 

Mit diesem Code kann ich den Titel nicht abrufen. Warum?

(Hinweis: ClassListPin ist nur eine statische Klasse, die einige Elemente und eine davon enthält, ist der List<Pin> Pins)

+0

Weil Sie es nennen müssen, zB 'obj.getTitle()' – leppie

+0

Haben Sie versucht, die Googles Suche? Dies ist ein ziemlich häufiger Anfängerfehler. – antonijn

+0

Etwas außerhalb des Themas, aber Eigenschaften wurden eingeführt, um Schreibsettern und Gettern entgegenzuwirken. Für weitere Informationen: http://msdn.microsoft.com/en-us/library/x9fsa0sw%28v=vs.80%29.aspx – Matthew

Antwort

43

Sie müssen Klammern nach einem Methodenaufruf hinzufügen, sonst wird der Compiler denken Sie sprechen die Methode selbst (ein Delegattyp), während Sie eigentlich über den Rückgabewert dieser Methode sprechen.

string t = obj.getTitle(); 

Zusätzliche Nicht-Essential Information

Außerdem haben Sie einen Blick auf Eigenschaften. Auf diese Weise können Sie Titel als eine Variable verwenden, während er intern wie eine Funktion funktioniert. Auf diese Weise müssen Sie nicht die Funktionen schreiben getTitle() und setTitle(string value), aber man könnte es so machen:

public string Title // Note: public fields, methods and properties use PascalCasing 
{ 
    get // This replaces your getTitle method 
    { 
     return _title; // Where _title is a field somewhere 
    } 
    set // And this replaces your setTitle method 
    { 
     _title = value; // value behaves like a method parameter 
    } 
} 

Oder könnten Sie automatisch implementierte Eigenschaften verwenden, die dies standardmäßig verwenden würde:

public string Title { get; set; } 

Und Sie müssten kein eigenes Backing-Feld erstellen (_title), der Compiler würde es selbst erstellen.

Außerdem können Sie Zugriffsebenen für Eigenschaftenaccessoren (Getter und Setter) ändern:

public string Title { get; private set; } 

Sie Eigenschaften verwenden, als ob sie Felder waren, das heißt:

this.Title = "Example"; 
string local = this.Title; 
+3

oh mein Gott ... es war ein kindischer Fehler! – gts13

3

Da getTitle ist keine string, einen Verweis oder delegate auf ein Verfahren zurück (wenn Sie wie), wenn Sie nicht explizit die Methode aufrufen.

Rufen Sie Ihre Methode auf diese Weise:

string t= obj.getTitle() ; //obj.getTitle() says return the title string object 

Doch diese funktionieren würde:

Func<string> method = obj.getTitle; // this compiles to a delegate and points to the method 

string s = method();//call the delegate or using this syntax `method.Invoke();` 
2

ein Verfahren Sie ausführen müssen Klammern hinzufügen, selbst wenn die Methode keine Argumente annimmt.

So sollte es sein:

string t = obj.getTitle(); 
6

getTitle ist eine Funktion, so dass Sie () nachdem sie setzen müssen.

string t = obj.getTitle(); 
5

Wie erwähnt Sie obj.getTile()

Aber in diesem Fall verwenden müssen, ich glaube, Sie einen Property verwenden suchen.

public class Pin 
{ 
    private string title; 

    public Pin() { } 

    public setTitle(string title) { 
     this.title = title; 
    } 

    public String Title 
    { 
     get { return title; } 
    } 
} 

Dies ermöglicht es Ihnen

foreach (Pin obj in ClassListPin.pins) 
{ 
    string t = obj.Title; 
} 
+0

Es sollte 'Title' sein, nicht' getTitle'. – antonijn

+0

Mein schlechtes, behoben. :) – eandersson

6

Wie @Antonijn angegeben zu verwenden, müssen Sie getTitle Methode ausführen, durch Zugabe von Klammern:

string t = obj.getTitle(); 

Aber ich möchte hinzufügen , dass Sie Java in C# programmieren. Es ist Konzept des properties (Paares Methoden erhalten und eingestellt), die in solchen Fällen verwendet werden sollen:

public class Pin 
{ 
    private string _title; 

    // you don't need to define empty constructor 
    // public Pin() { } 

    public string Title 
    { 
     get { return _title; } 
     set { _title = value; } 
    } 
} 

Und noch mehr, in diesem Fall, dass Sie Compiler nicht nur für get und set Methoden Generation fragen können, aber auch für die Rückspeicherung Generation, über auto-impelemented property Nutzung:

public class Pin 
{ 
    public string Title { get; set; } 
} 

Und jetzt brauchen Sie nicht zu Methode ausführen, weil Eigenschaften wie Felder verwendet:

foreach (Pin obj in ClassListPin.pins) 
{ 
    string t = obj.Title; 
} 
4

Sie können Ihren Klassencode hier unten vereinfachen und er wird so wie er ist, aber wenn Sie Ihr Beispiel arbeiten lassen möchten, fügen Sie am Ende Klammern hinzu: string x = getTitle();

public class Pin 
{ 
    public string Title { get; set;} 
} 
Verwandte Themen