为什么不可能执行以下操作:
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)
如前所述这里 -
可选参数是方法或委托参数的属性.在编译时调用具有已知可选参数的签名(方法或委托)时,编译器将在调用点处插入可选参数值.
运行时不知道可选参数,因此您无法在调用时插入可选参数.
因此,要使用它,您必须提取在编译时已知的具体实现(自定义委托),并将使用可选参数替换调用站点处的参数,并且也可以使用命名参数.
声明自定义委托 -
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)
| 归档时间: |
|
| 查看次数: |
8203 次 |
| 最近记录: |