一个ref或out参数必须是可赋值的变量。

9

我正在编写一个应用程序,可以建立反向代理连接,但是我遇到了问题!

错误在这里:new Form1.ProxyConfig()

当我尝试运行它时,出现错误:“引用或输出参数必须是可分配的变量

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
@Servy 不,这完全不是那个意思。如果调用者没有一个 ref 参数,那么你会得到一个非常不同的错误信息。这是一个完全不同的问题:表达式不能被赋值给...正如错误信息非常明确地指出的那样。 - Jim Balter
@JimBalter,我并不是说调用者应该省略 ref 关键字然后它就可以工作了,我是说解决方法是改变这个方法,使其不再通过引用传递参数,而不是将其更改为传递变量而不是值。这不仅仅是要修复编译器错误,而且实际上要编写一个好的解决方案。 - Servy
我的上述陈述是正确的:错误并不是参数不应该通过引用传递的很强的指示 - 这两个问题完全是正交的。调用者可能需要更新传递给它的ProxyConfig - 从上面的代码中无法知道这一点。而且很可能OP没有编写并且无法控制ProxyListenerStart。 - Jim Balter
1个回答

10

你不能像你在那里做的那样同时创建一个变量并将其作为引用传递。尝试这样做:

var config = new Form1.ProxyConfig()
{
    pclient_port = form2.ClientPort,
    pp_start = form2.LocalStartPort,
    pp_end = form2.LocalEndPort
};

int num1 = Form1.ProxyListenerStart( ref config, ref this._PN );

原因在于这样做没有任何意义,考虑以下情况:
if( int.TryParse( "123", out new int() ) )
{
    // there's no way for us to actually use the value TryParse stored
    // into the out parameter, since it doesn't have a name
}

32位dll?您的项目是否设置为“任何CPU”,并且您使用的是64位操作系统?如果是这样,请尝试强制将其设置为32位。 - Chris
顺便提一下,你应该考虑一下Servy留下的评论。将该参数设置为ref似乎有些奇怪。 - Chris
@Chris Servy的评论完全是错误的。如果ProxyListenerStart没有ref参数,那么编译器会直接说出来,而不是产生完全不同的消息:“ref或out参数必须是可分配的变量”。而且,ProxyListenerStart使用ref参数也没有什么奇怪的地方;显然它将设置传递给它的ProxyConfig中的一些字段。 - Jim Balter
@davidanderle,你会收到一个错误提示,因为你不能修改一个常量,所以将其传递给引用参数是没有意义的。编译器不知道也不关心XferData是否实际上改变了它的参数(即使它想知道也无法知道,因为这涉及到停机问题)。 - Jim Balter
@CazanovaHaxor Visual Studio 会告诉你那个异常发生的确切位置以及哪个变量为空。 - Jim Balter
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接