【问题标题】:C# cannot convert method to non delegate typeC# 无法将方法转换为非委托类型
【发布时间】:2013-01-30 09:41:58
【问题描述】:

我有一个名为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> 引脚)

【问题讨论】:

  • 因为你需要调用它,例如obj.getTitle()
  • 你试过搜索谷歌吗?这是一个相当常见的初学者错误。
  • 稍微偏离主题,但引入了属性以反对编写 setter 和 getter。欲了解更多信息:msdn.microsoft.com/en-us/library/x9fsa0sw%28v=vs.80%29.aspx
  • 我承认这是一个愚蠢的错误...

标签: c# .net methods delegates


【解决方案1】:

如前所述,您需要使用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;
}

【讨论】:

  • 那么应该是Title,而不是getTitle
【解决方案2】:

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

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

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

public string Title { get; private set; }

您可以像使用字段一样使用属性,即:

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

【讨论】:

  • 天哪……这是一个幼稚的错误!
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    因为getTitle 不是string,所以如果您没有显式调用该方法,它会返回一个对方法的引用或delegate(如果您愿意)。 p>

    这样调用你的方法:

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

    【讨论】:

      【解决方案5】:

      正如@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; }
          }  
      }
      

      更重要的是,在这种情况下,您不仅可以通过 auto-impelemented property 用法询问编译器生成 get 和 set 方法,还可以生成反向存储:

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

      现在您不需要执行方法,因为使用的属性类似于字段:

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

      【讨论】:

        【解决方案6】:

        要执行一个方法,您需要添加括号,即使该方法不带参数。

        应该是这样的:

        string t = obj.getTitle();
        

        【讨论】:

          【解决方案7】:

          getTitle是一个函数,所以你需要在它后面加上()

          string t = obj.getTitle();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多