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 を参照しているのではなく、ここで Parseを呼び出しています。

パラメータを削除することでこれを修正できます。

ParseIntDelegate firstParseIntMethod = Parse ; 

今度は、Parse の署名について不平を言う別のエラーが発生します。

private delegate int ParseIntDelegate();

private static int Parse(string x)

文字列パラメーターが必要なため、Parse は ParseIntDelegate に「適合」できません。ParseIntDelegate を変更して、問題を解決する文字列を取ることができます。

于 2013-03-28T21:18:10.260 に答える