1

所以我有一个简单的方法叫做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.

谢谢。

4

3 回答 3

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;
于 2012-07-05T02:23:26.553 回答
2

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

于 2012-07-05T02:22:09.373 回答
0

bool是一个值类型,你没有通过引用传递它。您需要将结果分配Invert给另一个或相同的变量以使其保持不变。

于 2012-07-05T02:22:19.653 回答