2012-06-06 28 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