【发布时间】:2016-10-14 02:59:40
【问题描述】:
我在重构一些代码时遇到了一个奇怪的错误 (?)。
由于某种未知原因,在 throw 语句中将动态变量传递给静态方法时出现编译器错误。
dynamic result = comObj.getfoo(bar);
// ....
throw ApiException.FromResult(result);
错误 CS0155
捕获或抛出的类型必须派生自 System.Exception
这是没有意义的,因为返回值 派生自 System.Exception。
此外,让我倾向于这是一个错误的原因是,该错误可以通过以下任一方式规避:
- 将
dynamic更改为var
var result = 0;
- 通过将变量转换为
object。
throw ApiException.FromResult((object)result);
有什么想法吗?
/* PS: code omitted for brevity */
using System;
public class Program
{
public class ApiException : Exception
{
public static ApiException FromResult(object result)
{
return new ApiException();
}
}
[STAThread]
public static void Main(string[] args)
{
dynamic result = 0;
throw ApiException.FromResult(result);
}
}
【问题讨论】:
-
Roslyn 和旧编译器都会出现这种情况。
-
@IanMundy:不;这是一个常规的静态方法。
-
@SLaks 正确,我用两种编译器进行了测试。那么,是错误还是设计?
-
如果
result是dynamic,那么表达式ApiException.FromResult(result)也是dynamic,它不是从Exception派生的。
标签: c#