1

パラメータとして渡されたデリゲート メソッドを呼び出す必要がありますが、このパラメータはオプションであるため、「宛先」クラスに実装されているメソッドにデフォルト値を設定したいと考えています。

これは、ほぼ期待どおりに機能する例です。

public class AgeCalculator
{
    public void SetAge(Client client, Func<int, int> getAge = default(Func<int, int>))
    {
        client.Age = getAge != default(Func<int, int>) ? getAge(client.Id) : this.getAge(client.Id);
    }

    private int getAge(int clientId) {
        return 10;
    }
}

その後..

class Program
{
    static void Main(string[] args)
    {
        AgeCalculator calculator = new AgeCalculator();

        Client cli1 = new Client(1, "theOne");

        calculator.SetAge(cli1);//Sets 10
        calculator.SetAge(cli1, getAge);//Sets 5
    }

    private static int getAge(int clientId) {
        return 5;
    }
}

今の質問; デリゲート値について尋ねないようにするために設定する必要があるデフォルト値は何ですか?

「public void SetAge(Client client, Func getAge = this.getAge)」を試してみましたが、うまくいきませんでした。

AgeCalculator.getAge に必要なタグまたは別の定義はありますか?動的メソッドを使用する必要がありますか?

前もって感謝します。

注:実際のシナリオには、TDD 指向のプロジェクトのより複雑なロジックが含まれます。これは、状況を要約するためのサンプルです。

4

2 に答える 2

7

メソッド引数のデフォルト値は、コンパイル時の定数でなければなりません。これは、参照型の既定値 (デリゲートとしては参照型) でdefault(Func<...>)あり、このコンテキストで使用できる唯一の既定値です。nullFunc

ただし、メソッドに 2 つのオーバーロードを提供する昔ながらの方法を使用すると、はるかにうまくいく可能性があります。

public void SetAge(Client client)
{
    // Select any default value you want by calling the other overload with it
    SetAge(client, this.getAge);
}

public void SetAge(Client client, Func<int, int> getAge)
{
    client.Age = getAge(client.Id);
}
于 2013-08-14T20:31:16.190 に答える