2013-02-14 20 views
22

Mam klasę o nazwie Pin.C# nie można przekonwertować metody na nie delegata typu

public class Pin 
{ 
    private string title; 

    public Pin() { } 

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

z innej klasy obiektów dodam szpilki w List<Pin> szpilki i od drugiego Chcę iteracyjne szpilki listę i uzyskać elementy. Więc mam ten kod.

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

Przy pomocy tego kodu nie mogę odzyskać tytułu. Czemu?

(Uwaga: ClassListPin jest tylko statyczne klasa, która zawiera kilka elementów i jedną z nich jest List<Pin> szpilki)

+0

Bo musisz go wywołać, np. 'Obj.getTitle()' – leppie

+0

Czy próbowałeś szukać w Google? Jest to dość powszechny błąd początkującego. – antonijn

+0

Lekko wyłączony temat, ale wprowadzono właściwości przeciwstawiające się ustawiaczom i pobierającym. Aby uzyskać więcej informacji: http://msdn.microsoft.com/en-us/library/x9fsa0sw%28v=vs.80%29.aspx – Matthew

Odpowiedz

43

Trzeba dodać nawiasy po wywołaniu metody, inny kompilator myśleć mówisz sama metoda (typ delegata), podczas gdy w rzeczywistości mówisz o wartości zwracanej przez tę metodę.

string t = obj.getTitle(); 

Extra nieistotnym Informacja

Również spojrzeć na właściwości. W ten sposób możesz użyć tytułu tak, jakby był zmienną, podczas gdy wewnętrznie działa jak funkcja. W ten sposób nie trzeba pisać funkcje getTitle() i setTitle(string value), ale można to zrobić tak:

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 
    } 
} 

Albo można użyć właściwości auto-wdrożone, który użyłby tego domyślnie:

public string Title { get; set; } 

Nie trzeba tworzyć własnego pola podkładu (_title), kompilator sam je utworzy.

Ponadto, można zmienić poziom dostępu dla akcesorów własności (pobierające i ustawiające):

public string Title { get; private set; } 

można użyć właściwości, jak gdyby były pola, tj:

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

o mój Boże ... to był dziecinny błąd! – gts13

3

Ponieważ getTitle nie jest string, zwraca odwołanie lub delegate sposobu (jeżeli jak), jeśli nie jawnie zadzwoń pod numer metody.

Zadzwoń metoda w ten sposób:

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

Jednak to będzie działać:

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

wykonać metodę trzeba dodać nawiasy, nawet jeśli metoda nie przyjmuje argumentów.

Tak powinno być:

string t = obj.getTitle(); 
6

getTitle jest funkcją, więc trzeba umieścić () po niej.

string t = obj.getTitle(); 
5

Jak wspomniano trzeba użyć obj.getTile()

Ale w tym przypadku myślę, że szukasz użyć Property.

public class Pin 
{ 
    private string title; 

    public Pin() { } 

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

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

Pozwoli to na korzystanie

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

Powinien to być "Tytuł", a nie "getTitle". – antonijn

+0

Moja zła, naprawiona. :) – eandersson

6

Jak stwierdzono @Antonijn, trzeba wykonać metodę getTitle dodając nawiasach:

string t = obj.getTitle(); 

Ale chcę dodać , że robisz programowanie w języku Java w języku C#. Istnieje pojęcie properties (para pobierania i ustawiania metod), które powinny być stosowane w takich przypadkach:

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; } 
    } 
} 

a nawet więcej, w tym przypadku można poprosić kompilator nie tylko do pobierania i ustawiania generacji metod, ale również dla generacji tylnia poprzez auto-impelemented property użycia:

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

a teraz nie trzeba wykonać metodę, ponieważ właściwości używane jak dziedzinach:

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

Możesz uprościć swój kod klasy do tego poniżej i będzie działać tak, jak jest, ale jeśli chcesz, aby twój przykład działał, dodaj nawias na końcu: string x = getTitle();

public class Pin 
{ 
    public string Title { get; set;} 
} 
Powiązane problemy