c# - 我可以在扩展方法中设置 decimal 变量的值吗?

标签 c# extension-methods

<分区>

我已经创建了一个 void 扩展方法,它可以与 decimal 数据类型一起使用。我希望能够在方法范围内修改 this 参数变量。这是我的扩展方法的代码:

public static void SetAndConvertIfHasValue(this decimal assignTo, double? valueToAssign)
{
    if (valueToAssign.HasValue)
        assignTo = (decimal)valueToAssign.Value;
    else
        assignTo = 0m;
}

但是,当我调用它时:

data.MyDecimalToSet.SetAndConvertIfHasValue(nullableDouble);

data.MyDecimalToSet 未设置为 nullableDouble 中的值(如果有的话)。

在调试中,如果我进入扩展方法,assignTo 会更改为正确的值,此更改不会冒泡到 data.MyDecimalToSet

在这一点上,我决定使用标准方法而不是扩展方法来解决这个问题,但是我很好奇为什么这不起作用?是否有解决办法,或者根本不可能?

最佳答案

这是行不通的,因为当您将变量传递给方法时,传递的是该变量的副本。当您对该副本进行操作时,您只会更改该副本。

请注意,无论变量是引用类型还是值类型,都会发生这种情况。但是,如果传递引用类型,则可以更改引用类型的内容,因为传递给方法的引用将被复制,但它仍将引用原始对象。

(decimal 是一个值类型,因此最后一点不适用于它。)

如果您改用标准方法,那么您的做法是正确的。

关于c# - 我可以在扩展方法中设置 decimal 变量的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34723456/

相关文章:

c# - 如何从特定的二进制文件格式中提取文本?

c# - 单元测试 Blazor RenderFragment 元素

c# - 关于使用 AES 加密进行 Zip 的廉价/免费 .NET 库的建议?

c# - 更快的方法来做一个 List<T>.Contains()

c# - 如何将依赖项注入(inject)扩展方法?

c# - 如何使用 EF 查看和编辑 DataGrid 中多个表的数据?

c# - SSRS : Get list of all reports and parameters in a single web service call?

c# - 在 .NET Framework 2.0 中使用扩展方法

c# - 扩展方法需要 "this"才能调用?

ruby - 扩展类和实例