“;this"”的默认值参数在c#扩展方法中

本文关键字:扩展 方法 参数 this quot 默认值 | 更新日期: 2023-09-27 18:16:27

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

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

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

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

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

谁能解释一下为什么MS限制第一种默认参数赋值而允许第二种?

“;this"”的默认值参数在c#扩展方法中

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

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

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

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

然后调用"旧"方式:

var user = UserUtils.CheckLogin(/* optional user here */);