【发布时间】:2018-04-17 02:25:40
【问题描述】:
假设我们有以下功能:
public static void AddTo(this int inInt, int inAmountToAdd)
{
inInt += inAmountToAdd;
}
这将简单地修改参数值“inInt”。
我能否以某种方式获取对调用此静态扩展方法的值类型对象的引用以对其进行修改?
【问题讨论】:
标签: c# extension-methods
假设我们有以下功能:
public static void AddTo(this int inInt, int inAmountToAdd)
{
inInt += inAmountToAdd;
}
这将简单地修改参数值“inInt”。
我能否以某种方式获取对调用此静态扩展方法的值类型对象的引用以对其进行修改?
【问题讨论】:
标签: c# extension-methods
在 C# 7.2 中,允许使用 ref 扩展方法。这在以前的版本中是不允许的。您必须像这样声明方法:
public static void AddTo(this ref int inInt, int inAmountToAdd)
{
inInt += inAmountToAdd;
}
然后还将 VS 2017(需要 15.5 或更高版本)与 language version set to 7.2 (or latest) 一起使用。
请注意,当您使用此功能时,调用方必须使用可以在接收方位置充当 ref 的东西(即字段、局部变量或数组槽)调用该方法。如果您打算在某种流畅的 API 中使用它,它可能无法按预期工作。例如,这将无法编译:GetInt().AddTo(1),因为 GetInt 方法的返回值不是有效的 ref。
请注意,根据this issue,上述语法可能需要 15.6,但如果我没看错的话,使用 ref this 的功能应该在 15.5 中可用。
【讨论】: