为什么是一个OUT参数不是一个匿名方法内不允许?(Why is an out parameter n

2019-09-01 23:27发布

这不是一个重复数据删除从一个匿名方法调用与ref或out参数的方法

我很奇怪,为什么出来的参数不匿名方法内进行。 不允许ref参数,使更多的意义,我,但输出参数,没有那么多。

你是如何看待这个想法

Answer 1:

在某些方面,这是一种欺骗。 Out参数为ref参数。 这里简直就是所使用的C#语言的值的额外属性。 之所以不允许他们是完全相同的ref参数。

这里的问题与使用匿名方法中的匿名方法之外声明的价值效应起源。 这样做将捕获的λ和流出必要性的任意值,其寿命超出当前的功能。 这是不兼容out具有固定的寿命参数。

想象一下,例如,该out的参数中提到的栈上的局部变量。 拉姆达可以在未来任意点执行,因此当栈帧不再有效,可以执行。 什么会在out参数的意思呢?



Answer 2:

这基本上是做的事实,匿名委托/ lambda表达式的参数被捕获的变量 ,并捕获ref / out变量不会使在C#/ CLR的任何意义,因为它需要ref / out内部字段 。 另外请注意,我配对这两个关键字,因为他们实际上是相同的。

如果你想有一个完整的解释, 埃里克利珀详细讨论这个设计点在他的博客。 (见附近,特别是底部的段落。)



Answer 3:

之间的唯一区别outref参数是一个out参数将具有[out]施加到其令牌。 他们是同样的事情,至于CLR而言。

为了实现它,编译器将不得不产生ref 领域 ,这是不支持的。

如果你仔细想想,你就会意识到,这是没有意义的,允许匿名方法来使用out参数。

什么将下面的代码?

static Func<object, object> Mess(out object param) {
    param = "Original";
    return i => param = i;
}
static Func<object, object> MessCaller() {
    object local;
    return Mess(out local);
}
static vouid Main() {
    Console.WriteLine(MessCaller()("New"));
    //The local variable that the lambda expression writes to doesn't exist anymore.
}


Answer 4:

我碰到这个难题来了,同时开发一些错误处理代码。 我想通过引用(出),以将记录到日志中的错误消息。 这给了我匿名方法进行多次检查,每个设置必要的错误消息的机会。

我最后写为不同工作的匿名方法的新包装。 但我想可能是一些价值的人,是我可以简单地作出了out参数,并定义一个委托,并提出我的代码使用的是一个私有方法。 希望这有助于/激励别人。

    protected delegate void OutStringDelegate(int divider, out string errorText);
    protected void codeWrapper(int divider, OutStringDelegate del)
    {
        string ErrorMessage = "An Error Occurred.";

        try
        {
            del(divider, out ErrorMessage);
        }
        catch
        {
            LogError(ErrorMessage);
        }
    }
    public void UseWrapper(int input)
    {
        codeWrapper(input, codeToCall);
    }
    private int somePrivateValue = 0;
    private void codeToCall(int divider, out string errorMessage)
    {
        errorMessage = "Nice Error Message here!";
        somePrivateValue = 1 / divider; // call me with zero to cause error.
    }
    private void LogError(string msg)
    {
        Console.WriteLine(msg);
    }


文章来源: Why is an out parameter not allowed within an anonymous method?