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首先將這個臨時引用賦值到一個常規引用上去,這時這個常規引用便是可以複製的了。