为什么我们不能用忽略的可选参数调用委托实例?

时间:2013-12-25 20:40:37

标签: c#

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
        }
    }
}

为什么我们不能用忽略的可选参数调用委托实例?

3 个答案:

答案 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#的类型安全系统。