使用Action和Func委托的可选和命名参数

Bra*_*iat 7 c# delegates

为什么不可能执行以下操作:

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");
Run Code Online (Sandbox Code Playgroud)

只有命名参数的情况:

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");
Run Code Online (Sandbox Code Playgroud)

只有可选参数的情况:

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");
Run Code Online (Sandbox Code Playgroud)

Roh*_*ats 7

如前所述这里 -

可选参数是方法或委托参数的属性.在编译时调用具有已知可选参数的签名(方法或委托)时,编译器将在调用点处插入可选参数值.

运行时不知道可选参数,因此您无法在调用时插入可选参数.

因此,要使用它,您必须提取在编译时已知的具体实现(自定义委托),并将使用可选参数替换调用站点处的参数,并且也可以使用命名参数.

声明自定义委托 -

public delegate int FuncDelegate(int x, int y = 20);
Run Code Online (Sandbox Code Playgroud)

现在你可以在方法体中使用它 -

FuncDelegate sum = delegate(int x, int y) { return x + y; };
int result = sum (x : 20, y: 40 );
result = sum(20);
Run Code Online (Sandbox Code Playgroud)

而且,仅compile time constant can be used in default parameters list.但是DateTime.Now is not a compile time constant这样也不能用于为参数指定可选值.

因此,对于Action部分,这将有效 -

public delegate void ActionDelegate(string message,
                                    DateTime dateTime = default(DateTime));
Run Code Online (Sandbox Code Playgroud)

现在使用委托 -

ActionDelegate print =
                delegate(string message, DateTime dateTime)
                { Console.WriteLine(dateTime.ToString()); };
print(dateTime: DateTime.Now, message: "SomeThing");
Run Code Online (Sandbox Code Playgroud)