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;
как заявил @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();