C#在发送前强制转换一个数组接口引用
我有这个密码C#在发送前强制转换一个数组接口引用,c#,interface,casting,ref,C#,Interface,Casting,Ref,我有这个密码 public MyResponse innerFunc(ref MyElem[]); public IResponse myFunc(ref IElem[] myElem) { return this.innerFunc(ref (A_CAST_OR_SOMETHING) myElem); } 在哪里 我的回答:我回答 迈勒姆:伊莱姆 演员或某物应该是MyElem的 当我这么做的时候 public IResponse myFunc(ref IElem[] myEle
public MyResponse innerFunc(ref MyElem[]);
public IResponse myFunc(ref IElem[] myElem)
{
return this.innerFunc(ref (A_CAST_OR_SOMETHING) myElem);
}
在哪里
- 我的回答:我回答
- 迈勒姆:伊莱姆
- 演员或某物应该是MyElem的
public IResponse myFunc(ref IElem[] myElem)
{
return this.innerFunc(ref ((MyElem[]) myElem));
}
编译器高亮显示括号(仅括号),并说:
ref或out参数必须是可赋值变量
我应该做什么?按照
ref
和out
的工作方式,作为该参数传入的东西必须能够直接分配给它。简而言之,它必须能够出现在=
符号的左侧。因为您不能这样做:
((MyElem[])myElem) = foo;
foo((MyElem[])myElem);
那么你也不能这样做:
((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
和out
的工作方式是,作为该参数传入的对象必须能够直接指定给它。简而言之,它必须能够出现在=
符号的左侧。因为您不能这样做:
((MyElem[])myElem) = foo;
foo((MyElem[])myElem);
那么你也不能这样做:
((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[]
,您需要创建一个单独的数组。您不能强制转换ref
参数。参数的类型必须完全匹配。因此,在该位置不可能有铸造操作员。您可以在调用innerFunc
之前创建匹配变量:
public IResponse myFunc(ref IElem[] myElem)
{
MyElem[] p = (MyElem[])myElem;
var result = this.innerFunc(ref p);
myElem = p;
return result;
}
如果参数的实际类型是
MyElem[]
,则此选项有效。如果它只是一个IElem[]
,则需要创建一个单独的数组。System.InvalidCastException:无法将类型为“IElem[]”的对象强制转换为类型为“MyElem[]”。在MyClass.myFunc(ref IElem[]myElem)
myElem是结构类型还是类类型?我确信你可以在两个方向上投射类数组……这是一个类。我也这么认为。System.InvalidCastException:无法将“IElem[]”类型的对象强制转换为“MyElem[]”类型。在MyClass.myFunc(ref IElem[]myElem)
myElem是结构类型还是类类型?我确信你可以在两个方向上投射类数组……这是一个类。我也这么认为。System.InvalidCastException:无法将“IElem[]”类型的对象强制转换为“MyElem[]”类型。在MyClass.myFunc(ref IElem[]myElem)
@Michael,Botz,我会被迫对数组中的每一个项目都施放1乘1吗?@apacay如果你传入一个实际的IElem[]那么是的。您需要在两个方向上创建具有不同类型的数组副本。但话说回来,也许你应该重新考虑你的设计。为什么需要传递ref参数?如果没有ref,您也会传递一个对同一对象的引用,只有当您真正想要更改引用所指向的对象时才需要ref。因为响应是“take”的,我使用MyLems在该类之外进行更改。你的意思是我应该做myFunc(IElem[]myElem,out IElem exiteme)
?@apacay你为什么不直接使用IList
?您可以添加和删除元素,它将修改您传入的原始列表。您可以将新的MyElem
对象添加到列表中,而无需强制转换。看起来您使用了ref参数来调整原始数组的大小,但是数组可能是错误的数据类型。System.InvalidCastException:无法将“IElem[]”类型的对象强制转换为“MyElem[]”类型。在MyClass.myFunc(ref IElem[]myElem)
@Michael,Botz,我会被迫对数组中的每一个项目都施放1乘1吗?@apacay如果你传入一个实际的IElem[]那么是的。您需要在两个方向上创建具有不同类型的数组副本。但话说回来,也许你应该重新考虑你的设计。为什么需要传递ref参数?如果没有ref,您也会传递一个对同一对象的引用,只有当您真正想要更改引用所指向的对象时才需要ref。因为响应是“take”的,我使用MyLems在该类之外进行更改。你的意思是我应该做myFunc(IElem[]myElem,out IElem exiteme)
?@apacay你为什么不直接使用IList
?您可以添加和删除元素,它将修改您传入的原始列表。您可以将新的MyElem
对象添加到列表中,而无需强制转换。看起来您使用ref参数可以调整原始数组的大小,但是数组可能是错误的数据类型。