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

时间:2012-07-05 02:20:10

标签: 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

感谢。

3 个答案:

答案 0 :(得分:7)

这是正常的。因为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;

答案 1 :(得分:2)

您的扩展方法接受bool按值,而不是参考。该方法的主体正在更改bool的本地副本,而不是调用者拥有的原始值。

答案 2 :(得分:0)

bool是一种值类型,您不是通过引用传递它。您需要将Invert的结果分配给另一个或相同的变量才能保留它。