2012-07-05 74 views
1

所以我有一個叫Invert簡單的方法:擴展方法不能正常工作C#

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

謝謝。

回答

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; 
+0

我知道這是浪費時間,但我只是瞭解擴展方法,並決定嘗試一個簡單的方法。 – 3aw5TZetdf

+0

謝謝,我會盡我所能接受你的答案。 – 3aw5TZetdf

2

您的擴展方法按值取值bool,而不是引用。該方法的主體正在更改bool的本地副本,而不是調用方擁有的原始值。

+0

所以我怎麼可能使該方法把它作爲參考? – 3aw5TZetdf

+0

@MatthewRz例如,您可以用'ref'註釋參數。 – reuben

+0

我收到一個錯誤,說我不能在'this'中使用'ref'。 – 3aw5TZetdf

0

bool是一個值類型,並且您不通過引用傳遞它。您需要將Invert的結果分配給另一個或相同的變量以使其保留。