相关疑难解决方法(0)

为什么匿名委托/ lambdas不在out/ref参数上推断类型?

StackOverflow上的几个C#问题询问如何使用outref参数创建匿名委托/ 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)

c# lambda delegates anonymous-methods out-parameters

16
推荐指数
1
解决办法
2240
查看次数

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

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

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

你对此有何看法?

c# anonymous-methods out-parameters ref-parameters

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

匿名方法的范围

匿名方法的一个好处是我可以使用调用上下文中的本地变量.有什么理由说这不适用于输出参数和功能结果吗?

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)

这不像其他案件那样有问题吗?谁保证只要执行匿名方法,引用仍指向活动对象?

delphi scope anonymous-methods delphi-2009

10
推荐指数
2
解决办法
4155
查看次数

如何避免在匿名方法块中使用out参数?

以下方法无法编译.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参数问题).

c# anonymous-methods out-parameters

6
推荐指数
1
解决办法
3054
查看次数

委托签名/通用代表?

我正在开发一个使用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模式已被用于在每个服务调用中复制它.我想将这个重复的代码重构为一个方法,但我不确定重试方法调用的最佳方法.我正在考虑让一个委托作为我的新方法的参数,但由于我不知道签名,我不确定如何以通用方式执行此操作.有人可以帮忙吗?谢谢.

.net c#

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