【问题标题】:Can I modify the value type object from within the extension method it is calling?我可以从它调用的扩展方法中修改值类型对象吗?
【发布时间】:2018-04-17 02:25:40
【问题描述】:

假设我们有以下功能:

public static void AddTo(this int inInt, int inAmountToAdd)
{
    inInt += inAmountToAdd;
}

这将简单地修改参数值“inInt”。

我能否以某种方式获取对调用此静态扩展方法的值类型对象的引用以对其进行修改?

【问题讨论】:

    标签: c# extension-methods


    【解决方案1】:

    在 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 中可用。

    【讨论】:

    • 你有我可以阅读的链接吗?我搜索但无法在“C# 7.2 中的新功能”中找到它。我发现了一堆功能请求,但没有任何地方表明它已完成并包含在内。
    • @Cory c# language repo 是个好地方。我发现这个item 让我觉得它没有完全实现,但我在sharplab.io 上尝试了它,它允许你运行最近的(每晚?)编译器构建并且它工作。所以我在最新的 VS 2017 中尝试了它,它提供了有关启用 7.2 的有用错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2013-05-06
    • 2012-09-05
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多