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参数可以调整原始数组的大小,但是数组可能是错误的数据类型。