gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:30 24 4
gpt4 key购买 nike

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

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com