1

我有这个代码

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

在哪里

  • 我的回应:IResponse
  • MyElem:IElem
  • A_CAST_OR_SOMETHING 应该属于 MyElem[]

当我这样做时

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

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

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

我应该做什么?

4

2 回答 2

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;
}
于 2012-06-06T17:10:51.780 回答
2

您不能转换ref参数。参数的类型必须完全匹配。因此,在这个位置上没有铸造操作员是可能的。您可以在调用之前创建一个匹配的变量innerFunc

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

如果参数的实际类型是 a ,则此方法有效MyElem[]。如果它只是一个IElem[],则需要创建一个单独的数组。

于 2012-06-06T17:12:37.000 回答