我有一个类,主要是大数组的包装器和一些相关的内务处理。我有一个带参数的函数。当我将类的实例传递给函数时,我希望数组被发送。
我考虑过明确的演员表。假设我有一些函数有一个byte [] ref参数。
public void SomeFunction(ref byte[] someBytes);
而且我有一些带有重载显式转换的类。
class SomeClass
{
byte[] someBytes;
public static explicit operator byte[](SomeClass someInstance)
{
return someInstance.someBytes;
}
}
现在我想用类作为参数调用该函数
SomeClass someInstance = new SomeClass();
SomeFunction(ref (byte[]) someInstance);
编译器抱怨“ref或out参数必须是可赋值变量”。我不确定我是不是没有正确地按摩编译器,或者你真的不能这样做。
我考虑了属性或函数的返回值,但是你不能通过ref传递那些(并且在自我教育之后我明白为什么......)
我不想让数组成为公共字段,但这确实满足了编译器。 我假设我可以创建一个局部变量来引用数组,但这是每个函数调用之前和之后的额外代码行...
编辑:可能值得注意的是,SomeFunction是由第三方编写的,我无权更改它。更糟糕的是,我不认为他们的参数实际上需要参考...答案 0 :(得分:9)
演员表不是可分配的变量;您正在从显式强制转换运算符传递返回值。
您可以创建一个保存正确转换值的变量,然后将其作为ref:
传递SomeClass someInstance = new SomeClass();
byte[] someBytes = (byte[])someInstance;
SomeFunction(ref someBytes);
请注意,它现在是可以重新分配的someBytes
变量。如果您希望重新分配someInstance.someBytes
的内部值,则必须在致电SomeFunction
后以某种方式重新分配someInstance
。
答案 1 :(得分:1)
你不能这样做,你需要首先实现将对象转换为变量的结果。
如果您要求的内容被允许,请考虑以下代码:
public void SomeFunction(ref byte[] someBytes)
{
someBytes = new byte[] { 1, 2, 3 };
}
SomeClass someInstance = new SomeClass();
SomeFunction(ref (byte[]) someInstance);
// uh-oh, what is "someInstance" now?
为什么参数标记为“ref”,你试图在这里解决什么问题?
答案 2 :(得分:1)
可以在C#中用作ref参数的值的范围受CLR允许的限制。它在CLI规范的12.4.1.5.2和12.1.6.1节中指定,并包含
强制转换不适合任何这些,因此不能用作ref
值。在通过引用传递之前,您需要将它分配给类似本地的值。
答案 3 :(得分:0)
你真的必须施放ref参数吗?在我的情况下,这样的工作正常。
byte[] someInstance = (byte[])new SomeClass();
SomeFunction(ref someInstance);