Подтвердить что ты не робот

С# не может преобразовать метод в тип без делегата

У меня есть класс под названием Pin.

public class Pin
{
    private string title;

    public Pin() { }

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

Из другого класса я добавляю объекты Pins в контакты List<Pin>, а другой - итерацию контактов List и получение элементов. Поэтому у меня есть этот код.

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

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

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

4b9b3361

Ответ 1

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

string t = obj.getTitle();

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

Кроме того, взгляните на свойства. Таким образом, вы можете использовать заголовок, как если бы он был переменной, тогда как внутри он работает как функция. Таким образом, вам не нужно писать функции 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), компилятор сам создаст его.

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

public string Title { get; private set; }

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

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

Ответ 2

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

string t = obj.getTitle();

Ответ 3

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

 string t = obj.getTitle();

Но я хочу добавить, что вы выполняете Java-программирование на С#. Существует концепция свойств (пара методов 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; }
    }  
}

И даже более того, в этом случае вы можете запросить компилятор не только для генерации генерации и установки методов, но и для создания обратного хранилища, через свойство с автоматическим изменением использование:

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

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

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

Ответ 4

Как уже упоминалось, вам нужно использовать 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;
}

Ответ 5

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

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

Ответ 6

Поскольку 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();`

Ответ 7

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

Итак, это должно быть:

string t = obj.getTitle();