6

これは明らかな質問のように聞こえると思いますが、デリゲートの戻り値の型は、委任するメソッドの戻り値の型と一致する必要がありますか?

例えば、このように:

public static void Save()
    {
        TS ts = new TS(SaveToDatabase);
    }

    public delegate void TS();

    private static void SaveToDatabase()
    { }

これが決して機能しない場所

public static void Save()
    {
        TS ts = new TS(SaveToDatabase);
    }

    public delegate string TS();

    private static void SaveToDatabase()
    { }
4

4 に答える 4

7

はい、同じ型を返し、同じパラメーターを持つ必要があります。つまり、関数とデリゲート宣言は同じ署名を持つ必要があります。

例:

    //Declare delegate (return double with double param)
    public delegate double Squared(double x);

    public class Circle
    {
        private double _radius;


        public static double ValueTimesValue(double Value)
        {
            return Value * Value;
        }

        public double Area(Squared sqd)
        {
            return sqd(_radius) * Math.PI;
        }

        public void CircleCharacteristics()
        {
            Squared Sq = new Squared(ValueTimesValue);
        }
    }

編集: If you see the sample code, Squared Delegate and ValueTimesValue function have the same return type and parameters.

于 2012-12-10T14:05:08.940 に答える
5

msdnから:

デリゲートを使用すると、関数をパラメーターとして渡すことができます。デリゲートの型安全性には、デリゲートとして渡す関数がデリゲート宣言と同じ署名を持っている必要があります。

そしてC#仕様からの別の引用:

次の両方が当てはまる場合、メソッドとデリゲートタイプは互換性があります。

  • それらは、同じ数または同じパラメーター、同じタイプ、同じ順序、同じパラメーター修飾子を持っています。
  • それらのリターンタイプは同じです。

互換性条件の非常に良い説明だと思います。ご覧のとおり、コードは2番目の条件に違反しているため、コンパイラエラーが発生します。

于 2012-12-10T14:08:49.837 に答える
2

簡単に言えば、デリゲートはメソッドのテンプレートです(過度に単純化するためにあまりにも激しくバッシングされないことを願っています)。視覚化が必要な場合は、それをロックのように考えてください。物理的な実装はキーのようなものです。キーは特定のロックに適合し、別のロックで失敗します。キーが間違ったロックに収まらないのと同じように、別のテンプレート(署名)を適用する方法は失敗します。

したがって、はい、「作業の委任先」にするメソッドに適切な署名が必要です。ソフトウェアの観点からもっと考えたい場合、デリゲートはそれが表す物理的な実装のコントラクトであり、インターフェースがそれが表す実際のメソッドのコントラクトであるのとよく似ています。それらは非常によく似た概念です。

于 2012-12-10T14:10:30.530 に答える
1

実際には必ずしもそうとは限りません。引数のタイプと結果は一致する必要があります。だからあなたはこれを行うことができます:

class Argument : BaseArgument    {    }

class BaseArgument    {    }

class BaseResult    {    }

class Result : BaseResult    {    }

delegate BaseResult MyDelegate(Argument argument);

class Test
{
    public Test()
    {
     var d1 = new MyDelegate(Method1);

    }

    Result Method1(BaseArgument a)
    {
        return null;
    }
}

一致とは、戻り型の共分散を意味するため、メソッドはより特殊な(派生)型を返すことができ、デリゲートは宣言します-デリゲートにはBaseResultが必要なので、結果はOKです。そして、引数の共変性は、引数がBaseArgumentであるため、メソッドがBaseArgumentをパラメーターとして宣言できるようにArgumentが提供されるとデリゲートが言うようにします。

于 2012-12-10T14:20:39.963 に答える