[VB转C#]少见的错误:编译错误:ref或out参数必须是一个lvalue

 

string strModelID=this.htModel[this.cmbModel.SelectedItem.ToString()].ToString();
    string strOrderID = this.htType[this.cmbOrderType.SelectedItem.ToString()].ToString();
    ADODB.Recordset rst = new ADODB.RecordsetClass();
    rst = dt.testADODB(strOrderID,strModelID);
      this.axctlVoucher1.setTemplateData(ref  (object)rst);

改为

 string strModelID=this.htModel[this.cmbModel.SelectedItem.ToString()].ToString();
    string strOrderID = this.htType[this.cmbOrderType.SelectedItem.ToString()].ToString();
    ADODB.Recordset rst = new ADODB.RecordsetClass();
    rst = dt.testADODB(strOrderID,strModelID);
    object tmp = (object)rst;
    this.axctlVoucher1.setTemplateData(ref tmp);

就可以了

 

原因:

这里要考虑类型强制转换时的一个细节,强制转换时编译器会先生成一个临时引用,然后再把这个临时引用传给一个和转换类型相同的引用,这个临时引用比较特别——不是一个左值(l),不能被赋值!而使用ref参数的方法一般都要对这个引用做修改,如果直接把这个临时引用传进去当时编译器会抱怨ref或out参数必须是一个l。而代码2首先将这个临时引用赋值到一个常规引用上去,这时这个常规引用便是可以复制的了。

posted @ 2008-08-30 20:50  拒绝潜水的鱼  阅读(457)  评论(0编辑  收藏  举报