3

Func<>型のパラメーターを受け入れるメソッドFoo4があります。匿名タイプのパラメーターを渡しても、エラーは発生しません。しかし、正しいシグニチャを持つメソッドを参照するタイプ'delegate'のオブジェクトを作成して渡すと、コンパイラエラーが発生します。この場合、なぜエラーが発生するのか理解できません。

class Learn6
    {
        delegate string Mydelegate(int a);
        public void Start()
        {
            Mydelegate objMydelegate = new Mydelegate(Foo1);

            //No Error
            Foo4(delegate(int s) { return s.ToString(); });

            //This line gives compiler error.
            Foo4(objMydelegate);

        }

        public string Foo1(int a) { return a.ToString();}



        public void Foo4(Func<int, string> F) { Console.WriteLine(F(42)); }
    }
4

4 に答える 4

8

メソッドへの参照を直接渡すと機能します。

Foo4(Foo1);

これは、同じ形状の実際のデリゲートは本質的に互換性があるとは見なされないためです。コントラクトが暗黙的である場合、コンパイラーはコントラクトを推測し、それらを照合します。それらが明示的である場合(たとえば、宣言されたタイプ)、推論は実行されません-それらは単に異なるタイプです。

これは次のようなものです。

public class Foo
{
    public string Property {get;set;}
}

public class Bar
{
    public string Property {get;set;}
}

2つのクラスが同じシグニチャを持ち、「互換性がある」ことがわかりますが、コンパイラはそれらを2つの異なるタイプと見なし、それ以上のものはありません。

于 2009-10-30T05:11:18.487 に答える
4

Func<int, string>MyDelegateは異なる宣言型であるためです。それらはたまたま同じメソッドのセットと互換性があります。しかし、それらの間に暗黙の変換はありません。

于 2009-10-30T05:04:11.677 に答える
0
        //This line gives compiler error.
        Foo4(objMydelegate);

        //This works ok.
        Foo4(objMydelegate.Invoke);
于 2009-10-30T10:56:56.557 に答える
0

シナリオによって異なりますが、一般的なケースでは、Mydelegateタイプを維持する理由はなく、どこでもFunc <int、string>を使用するだけです:)

于 2009-12-29T10:33:11.597 に答える