【问题标题】:Default Value for "this" parameter in C# Extension methodsC# 扩展方法中“this”参数的默认值
【发布时间】:2013-06-03 08:27:16
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我想说扩展方法需要与对象的实例相关联,因此默认的this 似乎没有任何意义。为什么要默认 this
  • @Bazzz 我只是想知道为什么 VS 没有显示任何编译错误。我知道它不能用 null 调用。
  • @SenJacob 实际上,您可以调用扩展方法将 null 项,因为编译器将其更改为静态方法调用。 User u = null; u.CheckLogin();。我倾向于在我的扩展方法中对 this 进行空检查以避免出现冲突。
  • @AdamHouldsworth 感谢您指出这一点。

标签: c# oop c#-4.0 extension-methods default-value


【解决方案1】:

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

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

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

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

然后调用“旧”方式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多