【发布时间】:2018-08-25 05:36:56
【问题描述】:
我正在编写一个可以建立反向代理连接的应用程序,但我遇到了问题!
错误在这里:new Form1.ProxyConfig()
当我尝试运行它时,我得到一个错误:“A ref or out argument must be an assignable variable”
private void startToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.startToolStripMenuItem.Text == "Start")
{
var form2 = new Form2();
if (form2.ShowDialog() != DialogResult.OK)
return;
int num1 = Form1.ProxyListenerStart(ref new Form1.ProxyConfig()
{
pclient_port = form2.ClientPort,
pp_start = form2.LocalStartPort,
pp_end = form2.LocalEndPort
}, ref this._PN);
if (num1 != 0)
int num2 = (int) MessageBox.Show("Error " + num1.ToString());
else startToolStripMenuItem.Text = "Stop";
}
else
{
Form1.ProxyListenerStop();
startToolStripMenuItem.Text = "Start";
listView1.Items.Clear();
toolStripStatusLabel2.Text = "0";
}
}
private struct ProxyConfig
{
public int pclient_port;
public int pp_start;
public int pp_end;
}
【问题讨论】:
-
这是一个非常强烈的迹象,表明该方法首先不应该通过引用传递参数,因为调用者不希望变量发生突变(因为没有变量) .
-
@Servy 不,这根本不是一个迹象。如果调用者没有 ref 参数,那么你会得到一个非常不同类型的错误消息。这是一个完全不同的问题:无法将表达式分配给 ... 正如错误消息非常明确地指出的那样。
-
@JimBalter 我并不是说调用者应该省略
ref关键字然后它就会起作用,我说解决方法是改变方法 不再通过引用传递参数,而是将其更改为传递变量而不是值。这不仅仅是修复编译器错误,而是真正写出一个好的解决方案。 -
我上面的说法是正确的:这个错误并不是一个非常强烈的指示参数不应该通过引用传递——这两个问题是完全正交的。调用者可能需要更新传递给它的 ProxyConfig - 从上面的代码中无法知道这一点。并且很可能OP没有编写并且无法控制ProxyListenerStart。