2016-05-17 134 views
2

我将一些VB代码转换为C#。现在我在这一点上卡住了,我必须使用ref关键字来传递参数。功能是如何将引用传递给函数

CurrentZone.Radius = ModSoftUniversal.perirad(ref (Z2 - Z1), ref (Xval - Xinc - CurrentZone.Centerx), ref (dXval - CurrentZone.Centerx), ref ErrorFlag); 

函数中的参数都在做一些计算sott和将这些值传递给函数,REF必须被使用。 Visual Studio显示以下enter image description here。我需要帮助传递参数

+2

会是什么,甚至意味着按引用传递的*结果*计算的? (此外,请将代码*作为文本发布*而不是屏幕截图 - 然后您可以将错误消息发布为更多文本。) –

+1

声明变量,不要将计算作为参数进行,因为它是参考参数,它需要存储位置值。恩。 int minusZ = Z2-Z1;然后改变做ref minusZ而不是(Z2 - Z1)。 –

+0

几个类似的链接: http://stackoverflow.com/questions/24828842/a-ref-or-out-argument-must-be-an-assignable-variable http://stackoverflow.com/questions/7307705/help-fixing-errors-in-c-sharp-a-ref-or-out-argument-must-be-an-assignable http://stackoverflow.com/questions/2165892/passing-an-explicit-cast -as-a-ref-parameter-c –

回答

6

您不能通过引用传递表达式。添加临时变量是这样的:

var z = Z2 - Z1; 
var x1 = Xval - Xinc - CurrentZone.Centerx; 
var x2 = dXval - CurrentZone.Centerx; 
CurrentZone.Radius = ModSoftUniversal.perirad(ref z, ref x1, ref x2, ref ErrorFlag); 
+0

我想指出试图传递'ref(Z2-Z1)'可能表示OP误解了'ref'正在做什么。增加一个临时可能会隐藏/丢弃一个重要的计算。如果这些值可以简单地丢掉,那么'ref'就没有意义了。 – Rob

+0

正确。但是有时方法的签名需要通过引用传递的值,但修改的结果(如果有的话)对于调用者并不重要。我相信作者知道他在做什么,情况就是如此。 – CodeFuller

+0

我知道你提到的这种方法,但认为它可以像这样工作 – Apoorv

2

作出这样

var z1z2Result = (Z2 - Z1); 
var xValxIncres = (Xval - Xinc - CurrentZone.Centerx); 
var dxValResult = (dXval - CurrentZone.Centerx); 

ModSoftUniversal.perirad(ref z1z2Result, ref xValxIncres, ref dxValResult, ref ErrorFlag); 

的原因是你不能做什么byreference如果没有分配给一个变量就可以引用本身

代码
2

您无法将“表达式”作为refout参数传递。

在C#ref参数意味着您的参数“参考”将在函数内部更改,这就是为什么您无法传递“表达式”。

你可以阅读更多关于它在https://msdn.microsoft.com/en-AU/library/14akc2c7.aspx

所以,你的代码应该看起来像:

int Z3 = (Z2 - Z1); 
int X1 = (Xval - Xinc - CurrentZone.Centerx); 
int X2 = (dXval - CurrentZone.Centerx); 
bool ErrorFlag = false; 
CurrentZone.Radius = ModSoftUniversal.perirad(ref Z3, ref X1, ref X2, ref ErrorFlag);