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 参数必须是可赋值变量
我应该怎么做?
ref
和out
的工作方式,您作为该参数传入的内容必须能够直接分配给。简而言之,它必须能够出现在=
标志的左侧。由于您无法执行此操作:
((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[]
,则需要创建一个单独的数组。