c# - 扩展方法无法正常工作 C#

标签 c# extension-methods pass-by-value

所以我有一个简单的方法叫做 Invert :

public static void Invert(this bool value)
{
    value = !value;
}

它位于 .dll 中的静态类中文件。现在,当我进入一个新的 Winforms 项目时,我添加了 .dll作为引用,到目前为止一切都很好。现在当我这样做时:
bool test = true;
test.Invert();

我没有收到任何错误,但是当我这样做时:
MessageBox.Show(test.ToString());

它输出 true ,好像什么都没变。我不确定是因为我在方法中所做的事情还是其他原因。但如果我去:
MessageBox.Show((!test).ToString());

它输出 false .

谢谢。

最佳答案

这工作正常。因为bool是一个值类型,它作为一个值传递并且原始变量( test )永远不会被更改。

相反,您应该执行以下操作:

public static bool Invert(this bool value) 
{ 
    return !value; 
} 

但是,创建一个方法来完成语言本身的工作有点浪费时间。

我认为扩展方法不会让您使用 this通过引用传递参数,因此您必须使用常规的静态方法,并长期调用它:
public static bool Invert(ref bool value) { value = !value; }

BooleanHelpers.Invert(ref test);

最后,这样做会更干净、更容易(更不用说对其他开发人员来说更明显了):
test = !test;

关于c# - 扩展方法无法正常工作 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11337148/

相关文章:

Swift 闭包通过引用捕获数组

c++ - 编程风格 : object with passages by references or value? (c++)

C# HttpWebRequest 底层连接被关闭 : An unexpected error occurred on a send

c# - LINQ 数据源在什么时候确定?

Python 和 Java 参数传递

c# - 无法向 .NET Core 中的 IConfiguration 添加扩展方法(但在其他类上工作)

c# - 将方法添加到自动生成的类

c# - 在 ASP.NET 中将订阅者添加到 Mail Chimp 3.0 中的列表

c# - 是否有与 Java 的 CountDownLatch 等效的 C#?

c# - 为什么选择静态类而不是单例实现?