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

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

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

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

Error 108 Cannot specify a default value for the 'this' parameter

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

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

谁能解释一下MS限制第一种默认参数赋值而允许第二种的原因?

最佳答案

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

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

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

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

然后调用“老”方式:

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

关于c# - C# 扩展方法中 "this"参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892675/

相关文章:

c# - 从 Paypal 获取详细信息?

c# - 使用未部署在 Azure 中的应用程序访问 Azure Key Vault 存储的 secret

C++ - 整个程序持续时间的单个本地类实例

c# - 在asp.net中发送带有多个查询字符串作为查询字符串参数的url

asp.net - 动态数据 - 从 DropDownList 中选择一个表以在 GridView 中搭建支架

c# - 为什么要在空 try block 中使用 try {} finally {}?

c# - 接口(interface)还是抽象类?

java - 多维数组列表配对

java - 将方法与返回的 jcomponents 和泛型一起使用

c# - 赋值表达式列表