c# - 增强 C# 语法糖(或绕过 "Cannot use ref or out parameter")

标签 c# .net lambda

请忽略这样的模式是否真的是个好主意。理由是我想捕获抛出的错误,或者插入/更新/删除的记录数量不匹配。我不想重复这个逻辑,当时这个定制感觉它只适用于大约四个长的“脚本”方法。

我的第一步是使用匿名函数。

public void DoSqlAction(Func<bool> f, string task, string ctx, ref bool cont, List<ResultInfo> resultInfo) {
    if (cont) {
        bool ret = false;
        try {
            if (f.Invoke()) {
                resultInfo.Add(new ResultInfo(seq, task, "Success", ctx, true));
                cont = true;
            } else {
                resultInfo.Add(new ResultInfo(seq, task, "Fail", ctx, false));
                cont = false;
            }
        } catch (Exception ex) {
            resultInfo.Add(new ResultInfo(seq, task, "Error: " + ex.Message, ctx, false));
            cont = false;
        }
    }
}

如果我尝试使用它:

 DoSqlAction(() => 1 == cx.Execute(someSql, anonymousTypeWithClassInstanceInside), "add item", refinfo.ToString(),ref cont, resultInfo);

anonymousTypeWithClassInstanceInside <-- 错误来源

出现错误:

Cannot use ref or out parameter 'abc' inside an anonymous method, lambda expression, or query expression

解决方案是去掉委托(delegate) Func<bool> f .我写这篇文章(也许它应该是一篇博文?)是因为我觉得生成编译时错误是一个障碍。

在这篇文章中,我发现了 Eric 文章的链接:

C# Cannot use ref or out parameter inside an anonymous method body

这里

http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

在看到 foreach 的实现方式之后,我开始思考……嗯……也许我正在寻求可定制的语法糖。

现在在 C#4 中这可能吗?在 C#5 中有可能吗?这让我考虑调查 http://nemerle.org在未来的某个时候,但我真的很想留在 C# 中。

最佳答案

孤立地,编写此代码的更好方法是:

public ResultInfo DoSqlAction(Func<bool> f, string task, string ctx) {
    try {
        if (f.Invoke()) {
            return new ResultInfo(seq, task, "Success", ctx, true);
        } else {
            return new ResultInfo(seq, task, "Fail", ctx, false);
        }
    } catch (Exception ex) {
        return new ResultInfo(seq, task, "Error: " + ex.Message, ctx, false);
    }
}

在外面:

while (/* there's stuff to do */) {
    var result = DoSqlAction(/* the next stuff */);
    infos.Add(result);
    if (!result.Succeeded)
        break;
}

或等效项。这消除了奇怪的副作用函数、ref 参数等。而且它更短。

关于c# - 增强 C# 语法糖(或绕过 "Cannot use ref or out parameter"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9561830/

相关文章:

c# - 在 C# 中将字符串一行转换为 List<string>

.net - 将 "obj"向下转换为底层数组类型(不带类型注释)

.net - 拦截/覆盖自定义控件上的 Name 属性?

c# 退出使用 lambda 的泛型 ForEach

c# - 将 foreach 更改为 lambda

c# - SQL查找组Column A和Column where Count in C的重复项

c# - C#中的日期时间转换问题

c# - WIF 通过 AJAX 到一个单独的域

.net - WinForms ListView 控件上的多行列表项?

c# - 将查询转换为 Lambda 表达式