2013-02-14 135 views
22

我有一个名为Pin的类。C#不能将方法转换为非委托类型

public class Pin 
{ 
    private string title; 

    public Pin() { } 

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

从另一个类我添加在List<Pin>销销对象,并从另一个我想遍历列表销和获得的元素。所以我有这个代码。

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

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

(注:ClassListPin仅仅是一个静态类,其中包含一些元件和这些中的一个,是List<Pin>引脚)

+0

因为您需要调用它,例如'obj.getTitle()' – leppie 2013-02-14 14:46:38

+0

您是否尝试过搜索Google?这是一个相当普遍的初学者错误。 – antonijn 2013-02-14 14:49:22

+0

稍微偏离主题,但引入了属性来反对写作创作者和获得者。欲了解更多信息:http://msdn.microsoft.com/en-us/library/x9fsa0sw%28v=vs.80%29.aspx – Matthew 2013-02-14 15:01:29

回答

43

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

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),编译器会自己创建它。

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

public string Title { get; private set; } 

您使用性能,如果他们领域,即:

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

噢,我的上帝......这是一个幼稚的错误! – gts13 2013-02-14 14:51:31

3

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

要执行的方法你需要添加圆括号,即使该方法不带参数。

所以它应该是:

string t = obj.getTitle(); 
6

getTitle是一个函数,所以你需要把()后。

string t = obj.getTitle(); 
5

如前所述,你需要使用obj.getTile()

但是,在这种情况下,我认为你正在寻找使用Property

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

它应该是'Title',而不是'getTitle'。 – antonijn 2013-02-14 14:52:34

+0

我的不好,修好了。 :) – eandersson 2013-02-14 15:10:07

6

由于@Antonijn说,你需要执行的getTitle方法,通过添加括号:

string t = obj.getTitle(); 

但我想补充,你正在用C#进行Java编程。还有就是properties(双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方法产生,但也为后面储存一代,通过auto-impelemented property用法:

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

现在你不需要执行方法,因为性质一样使用领域:

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

您可以将您的类代码简化为下面的代码,它将按原样运行,但如果您想让示例工作,请在末尾添加括号:string x = getTitle();

public class Pin 
{ 
    public string Title { get; set;} 
} 
相关问题