web-dev-qa-db-fra.com

C # ne peut pas convertir la méthode en type non délégué

J'ai une classe appelée Pin.

public class Pin
{
    private string title;

    public Pin() { }

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

À partir d'une autre classe, j'ajoute des objets Pins dans un List<Pin> pins et d'un autre je veux itérer les pins de List et récupérer les éléments. J'ai donc ce code.

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

Avec ce code, je ne peux pas récupérer le titre. Pourquoi?

(Remarque: ClassListPin est juste une classe statique qui contient certains éléments et l'un d'eux est le List<Pin> broches)

31
gts13

Vous devez ajouter des parenthèses après un appel de méthode, sinon le compilateur pensera que vous parlez de la méthode elle-même (un type délégué), alors que vous parlez en fait de la valeur de retour de cette méthode.

string t = obj.getTitle();

Informations supplémentaires non essentielles

Jetez également un œil aux propriétés. De cette façon, vous pouvez utiliser le titre comme s'il s'agissait d'une variable, tandis que, en interne, il fonctionne comme une fonction. De cette façon, vous n'avez pas à écrire les fonctions getTitle() et setTitle(string value), mais vous pouvez le faire comme ceci:

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

Ou vous pouvez utiliser des propriétés implémentées automatiquement, qui utiliseraient cela par défaut:

public string Title { get; set; }

Et vous n'auriez pas à créer votre propre champ de support (_title), Le compilateur le créerait lui-même.

En outre, vous pouvez modifier les niveaux d'accès pour les accesseurs de propriété (getters et setters):

public string Title { get; private set; }

Vous utilisez les propriétés comme s'il s'agissait de champs, c'est-à-dire:

this.Title = "Example";
string local = this.Title;
58
antonijn

Comme l'a indiqué @Antonijn, vous devez exécuter la méthode getTitle, en ajoutant des parenthèses:

 string t = obj.getTitle();

Mais je veux ajouter que vous faites Java programmation en C #. Il y a le concept de propriétés (paire de méthodes get et set), qui devrait être utilisé dans de tels cas:

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

Et encore plus, dans ce cas, vous pouvez demander au compilateur non seulement la génération de méthodes get et set, mais également la génération de stockage arrière, via propriété auto-impelemented utilisation:

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

Et maintenant, vous n'avez pas besoin d'exécuter la méthode , car les propriétés utilisées comme les champs:

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

getTitle est une fonction, vous devez donc mettre () après ça.

string t = obj.getTitle();
7
Bobson

Comme mentionné, vous devez utiliser obj.getTile()

Mais, dans ce cas, je pense que vous cherchez à utiliser un Property .

public class Pin
{
    private string title;

    public Pin() { }

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

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

Cela vous permettra d'utiliser

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

Vous pouvez simplifier votre code de classe ci-dessous et cela fonctionnera tel quel, mais si vous voulez que votre exemple fonctionne, ajoutez des parenthèses à la fin: string x = getTitle ();

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

Parce que getTitle n'est pas un string, il renvoie une référence ou delegate à une méthode (si vous le souhaitez), si vous ne le faites pas explicitement call = la méthode.

Appelez votre méthode de cette façon:

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

Cependant, cela fonctionnerait:

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();`
3
Lews Therin

Pour exécuter une méthode, vous devez ajouter des parenthèses, même si la méthode ne prend pas d'arguments.

Il devrait donc être:

string t = obj.getTitle();
2
Andre Loker