C# не удается преобразовать метод в тип без делегата

у меня есть класс с именем Pin.

public class Pin
{
    private string title;

    public Pin() { }

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

из другого класса я добавляю объекты Pins в List<Pin> pins и от другого я хочу повторить список контактов и получить элементы. У меня есть код.

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

С помощью этого кода я не могу получить название. Почему?

(Примечание: ClassListPin - это просто статический класс, который содержит некоторые элементы, и один из них -List<Pin> - пене)

7 ответов


вам нужно добавить скобки после вызова метода, иначе компилятор подумает, что вы говорите о самом методе (тип делегата), тогда как на самом деле вы говорите о возвращаемом значении этого метода.

string t = obj.getTitle();

Дополнительная Несущественная Информация

кроме того, посмотрите на свойства. Таким образом, вы можете использовать title как переменную, а внутренне он работает как функция. Таким образом, вам не придется писать функции getTitle() и setTitle(string value), но вы могли бы сделать это так:

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

или вы можете использовать автоматически реализованные свойства, которые будут использовать это по умолчанию:

public string Title { get; set; }

и вам не придется создавать собственное поле поддержки (_title), компилятор создаст его сам.

кроме того, вы можете изменить уровни доступа для доступа к свойствам (геттеры и сеттеры):

public string Title { get; private set; }

вы используете свойства, как если бы они были полями, т. е.:

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

getTitle является функцией, поэтому вам нужно поставить () после него.

string t = obj.getTitle();

как заявил @Antonijn, вам нужно выполнить метод getTitle, добавив скобки:

 string t = obj.getTitle();

но я хочу добавить, что вы занимаетесь Java-программированием на C#. Существует понятие свойства (пара методов get и set), которые следует использовать в таких случаях:

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

и даже больше, в этом случае вы можете попросить компилятор не только для генерации get и set методов, но и для генерации back storage, через авто-impelemented свойство использование:

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

и теперь вам не нужно выполнить метод, потому что свойства, используемые как поля:

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

как уже упоминалось, вы должны использовать obj.getTile()

но в этом случае я думаю, что вы не хотите использовать свойства.

public class Pin
{
    private string title;

    public Pin() { }

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

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

Это позволит вам использовать

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

вы можете упростить свой код класса до этого ниже, и он будет работать как есть, но если вы хотите, чтобы ваш пример работал, добавьте скобки в конце: строка x = getTitle ();

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

, потому что getTitle - это не string, он возвращает ссылку или delegate к методу (если хотите), если вы явно не вызов метод.

вызвать метод таким образом:

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

однако это сработает:

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

чтобы выполнить метод, вам нужно добавить круглые скобки, даже если метод не принимает аргументы.

так и должно быть:

string t = obj.getTitle();