C#在发送之前转换阵列接口参考

时间:2012-06-06 17:03:58

标签: c# interface casting ref

我有这段代码

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));
}

编译器突出显示括号(仅括号)并说:

  

ref或out参数必须是可赋值变量

我该怎么办?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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[],则需要创建一个单独的数组。