C#无法将方法转换为非委托类型

gts*_*s13 32 .net c# methods delegates

我有一个叫做的课Pin.

public class Pin
{
    private string title;

    public Pin() { }

    public setTitle(string title) {
        this.title = title;
    }
    public String getTitle()
    {
        return title;
    }
}
Run Code Online (Sandbox Code Playgroud)

从另一个类我在引脚中添加Pins对象,从另一个类我List<Pin>想迭代List引脚并获取元素.所以我有这个代码.

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.getTitle;
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,我无法检索标题.为什么?

(注意:ClassListPin只是一个包含一些元素的静态类,其中一个是List<Pin>引脚)

ant*_*ijn 61

您需要在方法调用后添加括号,否则编译器会认为您正在讨论方法本身(委托类型),而您实际上是在谈论该方法的返回值.

string t = obj.getTitle();
Run Code Online (Sandbox Code Playgroud)

额外的非必要信息

另外,看看属性.这样你就可以使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用自动实现的属性,默认情况下将使用此属性:

public string Title { get; set; }
Run Code Online (Sandbox Code Playgroud)

而且你不必创建自己的支持字段(_title),编译器会自己创建它.

此外,您可以更改属性访问者(getter和setter)的访问级别:

public string Title { get; private set; }
Run Code Online (Sandbox Code Playgroud)

您使用属性就像它们是字段一样,即:

this.Title = "Example";
string local = this.Title;
Run Code Online (Sandbox Code Playgroud)

  • 哦,天啊......这是一个幼稚的错误! (3认同)

Bob*_*son 7

getTitle是一个功能,所以你需要把()它放在后面.

string t = obj.getTitle();
Run Code Online (Sandbox Code Playgroud)


Ser*_*kiy 7

正如@Antonijn所说,你需要通过添加括号来执行 getTitle方法:

 string t = obj.getTitle();
Run Code Online (Sandbox Code Playgroud)

但我想补充一点,你在C#中进行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; }
    }  
}
Run Code Online (Sandbox Code Playgroud)

更重要的是,在这种情况下,您不仅可以向编译器询问get和set方法的生成,还可以通过auto-inslemented属性使用来生成后端存储:

public class Pin
{
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在你不需要执行方法,因为像字段一样使用属性:

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.Title;
}
Run Code Online (Sandbox Code Playgroud)


ean*_*son 5

如上所述,您需要使用 obj.getTile()

但是,在这种情况下,我认为你正在寻找一个财产.

public class Pin
{
    private string title;

    public Pin() { }

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

    public String Title
    {
        get { return title; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您使用

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.Title;
}
Run Code Online (Sandbox Code Playgroud)


leg*_*ing 5

您可以在下面简化您的类代码,它可以照常工作,但是如果您想使示例工作,请在最后加上括号:string x = getTitle();

public class Pin
{
   public string Title { get; set;}
}
Run Code Online (Sandbox Code Playgroud)