using System;
namespace Notes
{
class Program
{
static void Foo(int x, int y = 1)
{
Console.WriteLine("x: {0} and y: {1}", x, y);
}
static void Main(string[] args)
{
Action<int, int> f = Foo;
f(2, 4);
//f(2); // cannot be invoked
}
}
}
为什么我们不能用忽略的可选参数调用委托实例?
答案 0 :(得分:4)
编译器不知道你的代表持有什么方法。
如果要使用可选参数,则需要将委托声明为具有可选参数。
请注意编译器将可选参数烘焙到调用点;无论如何声明基础方法,它都将使用委托的默认值。
答案 1 :(得分:1)
为什么我们不能使用忽略的可选项调用委托实例 参数
因为未使用可选参数声明Action委托。声明你自己的委托来做那件事。
delegate void MyAction<T1, T2>(T1 t1,T2 t2 = default(T2));
void Main()
{
MyAction<int, int> f = Foo;
f(2, 4);
f(2);
}
static void Foo(int x, int y = 1)
{
Console.WriteLine("x: {0} and y: {1}", x, y);
}
答案 2 :(得分:0)
因为没有编译时指示存储在f
中的委托实例采用可选参数。您可以在运行时确定这一点,但这将违反C#的类型安全系统。