2

我正在尝试学习 C# 代表。编译这段代码时,我在主题行中收到此错误消息。

无法将类型“int”隐式转换为“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

2 回答 2

4

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

private delegate int ParseIntDelegate(string str);

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

由于您的Parse方法具有兼容的签名,因此您可以直接从中创建一个新的委托实例:

ParseIntDelegate firstParseIntMethod = Parse;

然后你可以像普通的方法应用程序一样调用它:

Console.WriteLine("Integer is {0}", firstParseIntMethod(x));
于 2013-03-28T21:10:55.467 回答
1

有几件事让我很震惊:

在 Main() 中,您有

ParseIntDelegate firstParseIntMethod = Parse(x);

这试图将 Parse(x) 的结果存储到 firstParseIntMethod 中。你在这里调用Parse,而不是指它。

您可以通过删除参数来解决此问题:

ParseIntDelegate firstParseIntMethod = Parse ; 

现在你会有一个不同的错误,抱怨 Parse 的签名。

private delegate int ParseIntDelegate();

private static int Parse(string x)

Parse 不能“适应”到 ParseIntDelegate,因为它需要一个字符串参数。您可以更改 ParseIntDelegate 以采用字符串来解决问题。

于 2013-03-28T21:18:10.260 回答