C# 在发送之前强制转换数组接口引用

本文关键字:转换 数组 接口 引用 | 更新日期: 2023-09-27 18:36:22

我有这个代码

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

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

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

我应该怎么做?

C# 在发送之前强制转换数组接口引用

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

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

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

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