【问题标题】:A ref or out argument must be an assignable variableref 或 out 参数必须是可赋值变量
【发布时间】: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。

标签: c# proxy reverse


【解决方案1】:

您不能像在此处那样创建变量并将其作为引用同时传递。试试这个:

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/64 位不匹配。你在加载一些非 .net dll 吗?
  • 感谢更正,现在又出现一个错误“试图加载格式不正确的程序。(HRESULT 异常:0x8007000B)”
  • 是的,我这样做是 proxlib.dll
  • 32 位 dll?您的项目是否设置为“任何 CPU”并且您使用的是 64 位操作系统?如果是这样,请尝试将其强制为 32 位。
  • 这是真的,它是 32 位 DLL 文件,我用的是 64 位,我会试试的,谢谢♥
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 2011-10-31
  • 1970-01-01
  • 2015-04-16
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多