标签: ref-parameters

为什么'ref'和'out'不支持多态?

请考虑以下事项:

class A {}

class B : A {}

class C
{
    C()
    {
        var b = new B();
        Foo(b);
        Foo2(ref b); // <= compile-time error: 
                     // "The 'ref' argument doesn't match the parameter type"
    }

    void Foo(A a) {}

    void Foo2(ref A a) {}  
}
Run Code Online (Sandbox Code Playgroud)

为什么会发生上述编译时错误?两者refout参数都会发生这种情况.

c# polymorphism out-parameters ref-parameters

123
推荐指数
5
解决办法
1万
查看次数

在什么情况下'out'参数有用(不能使用'ref'代替)?

据我所知,out参数的唯一用途是调用者可以从单个方法调用中获取多个返回值.但我们也可以使用ref参数获取多个结果值!

那么有没有其他情况下out参数可以证明是有用的,而我们不能使用ref参数呢?

谢谢.

c# out-parameters ref-parameters

18
推荐指数
2
解决办法
534
查看次数

为什么匿名方法中不允许使用out参数?

这不是使用匿名方法的ref或out参数调用方法的欺骗

我想知道为什么在匿名方法中不允许输出参数.不允许ref参数对我来说更有意义,但是out参数不是那么多.

你对此有何看法?

c# anonymous-methods out-parameters ref-parameters

14
推荐指数
2
解决办法
7307
查看次数

什么时候C#'out'或'ref'参数的值实际返回给调用者?

当我对一个outref参数进行赋值时,是否会立即将值赋给调用者提供的引用,还是在方法返回时分配给引用的outref参数值?如果方法抛出异常,则返回值吗?

例如:

int callerOutValue = 1;
int callerRefValue = 1;
MyMethod(123456, out callerOutValue, ref callerRefValue);

bool MyMethod(int inValue, out int outValue, ref int refValue)
{
    outValue = 2;
    refValue = 2;

    throw new ArgumentException();

    // Is callerOutValue 1 or 2?
    // Is callerRefValue 1 or 2?
}
Run Code Online (Sandbox Code Playgroud)

.net c# out-parameters ref-parameters

14
推荐指数
2
解决办法
1517
查看次数

ref参数和赋值在同一行

我最近碰到了一个讨厌的bug,简化的代码如下所示:

int x = 0;
x += Increment(ref x);
Run Code Online (Sandbox Code Playgroud)

...

private int Increment(ref int parameter) {
    parameter += 1;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

增量调用后的x值为1!一旦我发现发生了什么,这是一个简单的解决方案.我将返回值分配给临时变量,然后更新x.我想知道是什么解释了这个问题.这是我在忽略的规范或C#的某些方面.

.net c# ref-parameters

11
推荐指数
2
解决办法
223
查看次数

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

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

我考虑过明确的演员表.假设我有一些具有byte [] ref参数的函数.

    public void SomeFunction(ref byte[] someBytes);
Run Code Online (Sandbox Code Playgroud)

而且我有一些带有重载显式转换的类.

    class SomeClass
    {
        byte[] someBytes;
        public static explicit operator byte[](SomeClass someInstance)
        {
            return someInstance.someBytes;
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我想以类作为参数调用该函数

    SomeClass someInstance = new SomeClass();
    SomeFunction(ref (byte[]) someInstance);
Run Code Online (Sandbox Code Playgroud)

编译器抱怨"ref或out参数必须是可赋值变量".我不确定我是不是没有正确地按摩编译器,或者你真的不能这样做.

我考虑了属性或函数返回值,但你不能通过ref传递那些(并且在自我教育之后我明白为什么......)

我不想让数组成为公共字段,但这确实满足了编译器.我我可以创建一个局部变量来引用数组,但这是在每个函数调用之前和之后的额外代码行...

编辑:可能值得注意的是SomeFunction是由第三方编写的,我无权更改它.更糟糕的是,我不认为他们的参数实际上需要参考...

c# casting ref-parameters

9
推荐指数
1
解决办法
9482
查看次数

如何将out/ref extern参数转换为F#

我有一个C#extern声明,如下所示:

    [DllImport("something.dll")]
    public static extern ReturnCode GetParent(IntPtr inRef, out IntPtr outParentRef);
Run Code Online (Sandbox Code Playgroud)

如何将其翻译为F#?

pinvoke f# extern ref-parameters

7
推荐指数
1
解决办法
2573
查看次数

为什么ref参数不能像out参数一样被忽略?

C#7引入内联out参数的具体原因是ref什么?

以下内容适用于C#7:

int.TryParse("123", out _);
Run Code Online (Sandbox Code Playgroud)

但这是无效的:

public void Foo(ref int x) { }

Foo(ref _); // error
Run Code Online (Sandbox Code Playgroud)

我没有看到为什么不能将相同的逻辑应用于ref参数的原因.

c# ref-parameters c#-7.0

4
推荐指数
1
解决办法
826
查看次数

使用c#中的ref参数在堆栈上发生了什么?

我正在阅读有关WCF和IDispatchMessageInspector的一些C#文档,并且该接口定义了一个通过引用传递的"Message"对象,以便可以对其进行操作.

当您通过ref传递某些东西而不是正常传递时,堆栈上实际发生了什么?

c# stack ref-parameters

1
推荐指数
2
解决办法
172
查看次数

如何在方法中向下转换ref变量

我需要在一个方法中将long转发为int,其中long作为ref变量传递:

public void Foo(ref long l)
{
    // need to consume l as an int
}
Run Code Online (Sandbox Code Playgroud)

我怎么能轻松做到这一点?

.net c# casting ref-parameters

0
推荐指数
1
解决办法
415
查看次数