9

我有一个类,它主要是一个大数组和一些相关的家务的包装器。我有一个带有 ref 参数的函数。当我将类的实例传递给函数时,我希望发送数组。

我考虑了明确的演员表。假设我有一些具有 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 是由第三方编写的,我无权更改它。更糟糕的是,我认为他们的参数实际上不需要参考......

4

4 回答 4

9

强制转换不是可分配的变量;您正在从显式转换运算符传递返回值。

您可以在将其作为 ref 传递之前创建一个保存正确转换值的变量:

SomeClass someInstance = new SomeClass();
byte[] someBytes = (byte[])someInstance;
SomeFunction(ref someBytes);

请注意,它现在是someBytes可以重新分配的变量。如果您希望重新分配 的内部值,则必须someInstance.someBytes在调用后以某种方式重新分配。SomeFunctionsomeInstance

于 2010-01-29T23:21:58.930 回答
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”,您要在这里解决什么问题?

于 2010-01-29T23:22:55.373 回答
1

在 C# 中可用作 ref 参数的值的范围受 CLR 允许的范围的限制。它在 CLI 规范中的第 12.4.1.5.2 和 12.1.6.1 节中指定,包括

  • 当前方法的参数
  • 局部变量
  • 对象的成员字段
  • 静态场
  • 数组元素

演员表不适合其中任何一个,因此不能用作ref值。在通过引用传递它之前,您需要将它分配给一个类似于 local 的值。

于 2010-01-30T00:00:42.850 回答
0

你真的必须强制转换 ref 参数吗?在我的情况下,这样的事情很好。

byte[] someInstance = (byte[])new SomeClass(); 
SomeFunction(ref someInstance);
于 2017-10-13T11:39:00.050 回答