All*_*nek 3 c# lambda async-await c#-5.0
我有一个方法:
void MyMethod<T>(params Func<T>[] funcs) { }
Run Code Online (Sandbox Code Playgroud)
我想用异步lambdas调用它:
MyMethod(async () => 1, async () => 2, async () => 3);
Run Code Online (Sandbox Code Playgroud)
有用!但是如果我想让第三个lambda抛出异常呢?
MyMethod(async () => 1, async () => 2, async () => { throw new Exception(); });
Run Code Online (Sandbox Code Playgroud)
上面没有编译,它给出了两个相同的错误:
CS0201只能将赋值,调用,递增,递减和新对象表达式用作语句
我不确定它为什么会出现这个错误,但我理解为什么它无法编译 - 前两个lambdas是Func<Task<int>>最后一个Func<Task>.我希望它能给我一个更好的编译错误,但让我们把这个问题放在一边.
如何编译代码?我可能不得不告诉编译器我想为第三个异步lambda生成什么类型的任务.我找到的一种方法是在return语句后指定一个throw语句:
MyMethod(async () => 1, async () => 2, async () => { throw new Exception(); return 3; });
Run Code Online (Sandbox Code Playgroud)
除了丑陋和令人困惑之外,它还会生成编译器警告:
CS0162检测到无法访问的代码
如何让编译器满意?如何避免无法访问的代码才能使其编译?是否有另一种方法来指定异步lambda返回的任务类型?
另外,为什么我在上面的例子中遇到CS0201错误?
问题是编译器推断你T是Task因为最后一个lambda没有返回类型.
因此,它尝试将第一个lambda解析为没有返回值,这意味着它们必须作为语句而不是表达式有效.由于1作为一个声明是无效的,你这个奇怪的错误.
要编译代码,请显式传递泛型类型参数:
MyMethod<Task<int>>(async () => 1, async () => 2, async () => { throw new Exception(); });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |