C#扩展方法中"this"参数的默认值

Sen*_*cob 2 c# oop extension-methods default-value c#-4.0

为什么我不能给扩展方法的this参数赋予默认参数值?

public static User CheckLogin(this User user = null)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

错误108无法为"this"参数指定默认值

但是,当我写下面的内容时,编译成功了.

public static User CheckLogin([DefaultValue(null)]this User user)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么MS限制第一种默认参数赋值同时允许第二种?

Ada*_*rth 7

那些不是可比较的概念.第一个是编译器支持的可选参数,第二个是设计工具之类的元数据默认值(它没有直接编译器支持代码中的方法调用).为this扩展方法的参数设置默认值是没有意义的,因为该值将从调用目标派生.

我最好的猜测是为什么它们不支持this扩展方法中的可选参数是有限的回报(实现成本与开发人员的利益)以及编码风格的混淆.扩展方法将自己设置为现有类型的假额外方法,因此this很好地修复了您正在扩展的类型.想要改变this就等于想要改变扩展方法提供的样式,所以你也可以不使用它们.

如果您希望它是可选的,请不要使用扩展方法,而是使用静态方法:

public static User CheckLogin(User user = null)
{
   // etc
}
Run Code Online (Sandbox Code Playgroud)

然后调用"旧"方式:

var user = UserUtils.CheckLogin(/* optional user here */);
Run Code Online (Sandbox Code Playgroud)