这不是一个重复数据删除从一个匿名方法调用与ref或out参数的方法
我很奇怪,为什么出来的参数不匿名方法内进行。 不允许ref参数,使更多的意义,我,但输出参数,没有那么多。
你是如何看待这个想法
这不是一个重复数据删除从一个匿名方法调用与ref或out参数的方法
我很奇怪,为什么出来的参数不匿名方法内进行。 不允许ref参数,使更多的意义,我,但输出参数,没有那么多。
你是如何看待这个想法
在某些方面,这是一种欺骗。 Out
参数为ref
参数。 这里简直就是所使用的C#语言的值的额外属性。 之所以不允许他们是完全相同的ref
参数。
这里的问题与使用匿名方法中的匿名方法之外声明的价值效应起源。 这样做将捕获的λ和流出必要性的任意值,其寿命超出当前的功能。 这是不兼容out
具有固定的寿命参数。
想象一下,例如,该out
的参数中提到的栈上的局部变量。 拉姆达可以在未来任意点执行,因此当栈帧不再有效,可以执行。 什么会在out
参数的意思呢?
这基本上是做的事实,匿名委托/ lambda表达式的参数被捕获的变量 ,并捕获ref
/ out
变量不会使在C#/ CLR的任何意义,因为它需要ref
/ out
内部字段 。 另外请注意,我配对这两个关键字,因为他们实际上是相同的。
如果你想有一个完整的解释, 埃里克利珀详细讨论这个设计点在他的博客。 (见附近,特别是底部的段落。)
之间的唯一区别out
和ref
参数是一个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.
}
我碰到这个难题来了,同时开发一些错误处理代码。 我想通过引用(出),以将记录到日志中的错误消息。 这给了我匿名方法进行多次检查,每个设置必要的错误消息的机会。
我最后写为不同工作的匿名方法的新包装。 但我想可能是一些价值的人,是我可以简单地作出了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);
}