将显式强制转换作为ref参数传递(C#)

时间:2010-01-29 23:16:33

标签: c# casting ref-parameters

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

我考虑过明确的演员表。假设我有一些函数有一个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 个答案:

答案 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);