[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首先将这个临时引用赋值到一个常规引用上去,这时这个常规引用便是可以复制的了。
出处:http://slave2.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。