2012-06-06 62 views
1

之前我有此代碼C#鑄接口參考數組發送

public MyResponse innerFunc(ref MyElem[]); 
public IResponse myFunc(ref IElem[] myElem) 
{ 
    return this.innerFunc(ref (A_CAST_OR_SOMETHING) myElem); 
} 

  • MyResponse:IResponse
  • MyElem:IElem
  • A_CAST_OR_SOMETHING應MyElem的[]

當我這樣做

public IResponse myFunc(ref IElem[] myElem) 
{ 
    return this.innerFunc(ref ((MyElem[]) myElem)); 
} 

編譯器higlights 括號(僅括號),並說:

ref或out參數必須是可分配的變量

我應該是什麼在做什麼?

回答

2

refout工作的方式,您傳遞的參數必須能夠直接分配給該參數。總之,它必須能夠出現在=符號的左側。既然你不能做到這一點:

((MyElem[])myElem) = foo; 

那麼你也可以這樣做:

foo((MyElem[])myElem); 

要解決這個問題,你需要引入一個臨時變量:

public IResponse myFunc(ref IElem[] myElem) 
{ 
    var temp = (MyElem[])myElem; 
    var response = this.innerFunc(ref temp); 

    myElem = (IElem[])temp; 
    return response; 
} 
+0

'System.InvalidCastException:無法強制類型爲'IElem []'的對象鍵入'MyElem []'。 at MyClass.myFunc(ref IElem [] myElem)' – apacay

+0

MyElem是結構類型還是類類型?我確信你可以在兩個方向上施放陣列類... –

+0

這是一個類。我也是這麼想。 – apacay

2

你不能投ref參數。參數的類型必須完全匹配。因此在這個位置上不可能有鑄造操作員。你可以調用innerFunc之前創建一個匹配的變量:

public IResponse myFunc(ref IElem[] myElem) 
{ 
    MyElem[] p = (MyElem[])myElem; 
    var result = this.innerFunc(ref p); 
    myElem = p; 
    return result; 
} 

這工作,如果該參數的實際類型是MyElem[]。如果它只是一個IElem[],你需要創建一個單獨的數組。

+0

'System.InvalidCastException:無法強制類型爲'IElem []'的對象輸入'MyElem []'。 at MyClass.myFunc(ref IElem [] myElem)' – apacay

+0

@Michael,Botz,難道我不得不一個一個地投射數組中的每一項? – apacay

+1

@apacay如果你通過一個實際的IElem []然後是的。您需要在兩個方向上創建不同類型數組的副本。但是,也許你應該重新考慮你的設計。爲什麼你需要傳遞一個ref參數?如果沒有參考,你也傳遞一個對同一個對象的引用,你只需要參考如果你真的想改變引用指向的對象。 – Botz3000