StackOverflow上的几个C#问题询问如何使用out或ref参数创建匿名委托/ lambdas .例如,见:
为此,您只需指定参数的类型,如:
public void delegate D(out T p);
// ...
D a = (out T t) => { ... }; // Lambda syntax.
D b = delegate(out T t) { ... }; // Anonymous delegate syntax.
Run Code Online (Sandbox Code Playgroud)
我很好奇的是为什么明确要求类型.有这种情况的特殊原因吗?也就是说,从编译器/语言的角度来看,为什么不允许以下内容?
D a = (out t) => { ... }; // Lambda syntax -- implicit typing.
D b = delegate(out t) { ... }; // Anonymous delegate syntax -- implicit typing.
Run Code Online (Sandbox Code Playgroud)
甚至更好,只是:
D a = (t) …Run Code Online (Sandbox Code Playgroud) 匿名方法的一个好处是我可以使用调用上下文中的本地变量.有什么理由说这不适用于输出参数和功能结果吗?
function ReturnTwoStrings (out Str1 : String) : String;
begin
ExecuteProcedure (procedure
begin
Str1 := 'First String';
Result := 'Second String';
end);
end;
Run Code Online (Sandbox Code Playgroud)
当然是非常人为的例子,但我遇到了一些有用的情况.
当我尝试编译它时,编译器抱怨他"无法捕获符号".此外,当我尝试这样做时,我收到了一个内部错误.
编辑我刚刚意识到它适用于普通参数
... (List : TList)
Run Code Online (Sandbox Code Playgroud)
这不像其他案件那样有问题吗?谁保证只要执行匿名方法,引用仍指向活动对象?
以下方法无法编译.Visual Studio警告"可能无法在匿名方法中使用out参数".该WithReaderLock(Proc action)方法需要一个delegate void Proc().
public Boolean TryGetValue(TKey key, out TValue value)
{
Boolean got = false;
WithReaderLock(delegate
{
got = dictionary.TryGetValue(key, out value);
});
return got;
}
Run Code Online (Sandbox Code Playgroud)
获得这种行为的最佳方法是什么?(请不要提供有关线程安全词典的建议,这个问题一般是为了解决out参数问题).
我正在开发一个使用Windows Mobile设备调用Web服务的项目.
需要说明如果服务调用失败,则应提示用户重试.目前,有一个服务代理调用Web服务代理上的所有方法,如果调用失败,则会有一些代码提示用户重试,然后再次调用该调用.它看起来像这样:
public void MyServiceCall(string stringArg, bool boolArg, int intArg)
{
try
{
MyWebService.MyServiceCall(stringArg, boolArg, intArg);
}
catch(SoapException ex)
{
bool retry = //a load of horrid code to prompt the user to retry
if (retry)
{
this.MyServiceCall(stringArg, boolArg, intArg);
}
}
}
Run Code Online (Sandbox Code Playgroud)
catch中的东西在系统上看起来比在该片段中看起来更麻烦,并且CTRL-C CTRL-V模式已被用于在每个服务调用中复制它.我想将这个重复的代码重构为一个方法,但我不确定重试方法调用的最佳方法.我正在考虑让一个委托作为我的新方法的参数,但由于我不知道签名,我不确定如何以通用方式执行此操作.有人可以帮忙吗?谢谢.