2

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

public static User CheckLogin(this User user = null)
{
    ...
}

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

但是,当我像下面这样编写时,编译成功。

public static User CheckLogin([DefaultValue(null)]this User user)
{
    ...
}

谁能解释为什么 MS 限制第一种默认参数分配而允许第二种默认参数分配的原因?

4

1 回答 1

7

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

关于为什么他们不支持this扩展方法中的可选参数,我的最佳猜测是回报有限(实施成本与开发人员的收益)和编码风格的混乱。扩展方法将自己设置为现有类型上的假额外方法,因此this可以很好地固定到您要扩展的类型。想改变this就等于想改变扩展方法提供的样式,所以你最好不要使用它们。

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

public static User CheckLogin(User user = null)
{
   // etc
}

然后调用“旧”方式:

var user = UserUtils.CheckLogin(/* optional user here */);
于 2013-06-03T08:31:36.207 回答