2013-03-28 34 views
1

我想学习C#的代表。编译此位代码时,我在主题行中收到此错误消息。不能类型“诠释”隐式转换为“Foo.Bar.Delegates.Program.ParseIntDelegate”

不能类型“诠释”隐式转换为“Foo.Bar.Delegates.Program.ParseIntDelegate”

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Foo.Bar.Delegates 
{ 
    class Program 
    { 
     private delegate int ParseIntDelegate(); 

     private static int Parse(string x) 
     { 
      return int.Parse(x); 
     } 

     static void Main() 
     { 
      string x = "40"; 
      int y = Parse(x); //The method I want to point the delegate to 

      ParseIntDelegate firstParseIntMethod = Parse(x); 

      //generates complier error: cannot implicity convert type int 
      //to 'Foo.Bar.Delegates.Program.ParseIntDelegate' 

      ParseIntDelegate secondParseIntMethod = int.Parse(x); //Same error 

      Console.WriteLine("Integer is {0}", firstParseIntMethod()); 
     } 
    } 
} 

所以我坚持,直到我能理解它是什么,我做错了。如果有人能帮我解决这个问题,我会非常感激。

回答

4

首先,您的委托类型应该是:

private delegate int ParseIntDelegate(string str); 

委托类型应与你要转换的方法的签名。在这种情况下Parse接受一个string参数并返回一个int

由于您Parse方法有一个兼容的特征,你可以直接从它创建一个新的委托实例:

ParseIntDelegate firstParseIntMethod = Parse; 

然后你就可以调用它像一个正常的方法应用:

Console.WriteLine("Integer is {0}", firstParseIntMethod(x)); 
0

有一些东西,跳出来对我:

在Main()中,您有

ParseIntDelegate firstParseIntMethod = Parse(x); 

这试图存储解析(X)转换成firstParseIntMethod的结果。你调用解析这里,不是指它。

您可以通过删除参数解决这个问题:

ParseIntDelegate firstParseIntMethod = Parse ; 

现在你将有一个不同的错误,抱怨解析的签名。

private delegate int ParseIntDelegate(); 

private static int Parse(string x) 

解析不能'拟合'到ParseIntDelegate中,因为它需要一个字符串参数。您可以更改ParseIntDelegate以采用字符串来解决问题。

+0

是,请先参阅,然后调用并获得相匹配的签名。多谢你们。 – birdinacage

+0

很乐意帮忙 - 如果这是对你有用,你可能标志着李的回答是解决你的问题。 –

+0

我如何评价李? – birdinacage

相关问题