11

次のことができない理由:

Func<int, int, int> sum = delegate(int x, int y = 20) { return x + y; };

Action<string, DateTime> print = 
    delegate(string message, DateTime datetime = DateTime.Now) 
    { 
        Console.WriteLine(message);
    };

sum(x: 20, y: 40);
print(datetime: DateTime.Now, message: "Hello");

名前付きパラメータのみの場合:

Func<int, int, int> sum = delegate(int x, int y) { return x + y; };

Action<string, DateTime> print = 
    delegate(string message, DateTime datetime) 
    { 
        Console.WriteLine("{0} {1}", message, datetime);
    };

Console.WriteLine(sum(y: 20, x: 40));
print(datetime: DateTime.Now, message: "Hello");

オプションのパラメーターのみの場合:

Func<int, int, int> sum = delegate(int x, int y = 20) { return x + y; };

Action<string , DateTime> print = 
    delegate(string message, DateTime datetime = DateTime.Now)
    { 
        Console.WriteLine("{0} {1}",message, datetime);
    };

Console.WriteLine(sum(40));
print("Hello");
4

3 に答える 3

9

ここで述べたように-

オプションのパラメーターは、メソッドまたはデリゲート パラメーターの属性です。コンパイル時に既知の省略可能なパラメーターを持つシグネチャ (メソッドまたはデリゲート) を呼び出すと、コンパイラは呼び出しサイトに省略可能なパラメーター値を挿入します。

ランタイムは省略可能なパラメーターを認識しないため、呼び出されたときに省略可能なパラメーターを挿入するデリゲートを作成することはできません。

したがって、それを使用するには、コンパイル時に既知であり、呼び出しサイトのパラメーターをオプションのパラメーターに置き換え、名前付きパラメーターも使用できる具体的な実装 (カスタム デリゲート) を抽出する必要があります。

カスタムデリゲートを宣言 -

public delegate int FuncDelegate(int x, int y = 20);

メソッド本体で使用できるようになりました-

FuncDelegate sum = delegate(int x, int y) { return x + y; };
int result = sum (x : 20, y: 40 );
result = sum(20);

また、のみcompile time constant can be used in default parameters list。ただしDateTime.Now is not a compile time constant、パラメーターにオプションの値を指定するためにも使用することはできません。

したがって、アクション部分の場合、これは機能します-

public delegate void ActionDelegate(string message,
                                    DateTime dateTime = default(DateTime));

ここでデリゲートを使用してください -

ActionDelegate print =
                delegate(string message, DateTime dateTime)
                { Console.WriteLine(dateTime.ToString()); };
print(dateTime: DateTime.Now, message: "SomeThing");
于 2013-11-03T10:43:39.870 に答える