MVC3对c#可选参数做了什么?

本文关键字:什么 参数 MVC3 | 更新日期: 2023-09-27 18:06:57

设置以下控制器

public class HomeController : Controller
{
    // GET: /Home/Read    
    public string Read(Sample sample = null)
    {
        if (sample != null)
            Console.WriteLine("Not null");
        else
            Console.WriteLine("null");
        return "";
    }
}
public class Sample
{
}

样本不为空。这是一个bug还是一个特性?

MVC3对c#可选参数做了什么?

可选参数通过调用站点重写实现。由于MVC引擎将使用完整的参数列表调用控制器,因此可选参数根本不相关。

例如,给定以下函数:

public void Foo(int bar = 1, int baz = 2)
{
}

这样称呼:

Foo();

导致编译器实际解释为:

Foo(1, 2);

调用保持为Foo(),然后在运行时将方法本身添加到参数中,这并没有什么神奇之处。参数是在编译时插入的,不需要再做任何操作。

Update:为了向MVC表明给定的路由参数是可选的,您可以在定义路由时将其设置为UrlParameter.Optional。此时,动作方法的默认参数值应该开始生效。

这是一个特性而不是一个bug。绑定器看到方法签名是唯一有意义的(如果你定义一个没有参数的方法签名,我认为它会被调用,否则你会得到"模糊调用"错误),并创建一个空实例,因为没有查询字符串参数可用。因为是模型绑定器在做创建实例的魔术,而不是编译器,所以是MVC在做。