c# - 带有“DoesNotReturn”属性的编译器错误
问题描述
我在 net-standard 2.1 (C# 8.0) 项目中实现了一些静态 throw 辅助方法。
[DoesNotReturn]
public static void InvalidOperation(String message, String caller, String path, Int32 line)
{
throw new InvalidOperationException($"{message}\n{caller}|{path}|{line}");
}
我想在 NET 5.0 项目中使用它们,例如:
public static BitmapSource GetBitmapSource(String uri)
{
if (Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
{
return new BitmapImage(_uri);
}
Throw.InvalidOperation( $"Invalid uri {uri}.");
}
但是编译器仍然返回错误 CS0161: "Not all code paths return a value"
解决方案
先写出异常路径:
public static BitmapSource GetBitmapSource(String uri)
{
if (!Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
{
Throw.InvalidOperation( $"Invalid uri {uri}.");
}
return new BitmapImage(_uri);
}
现在,就编译器而言,该方法返回。
要考虑的另一件事是让辅助方法返回异常,而不是抛出异常。调用它的方法可以抛出它。这样编译器就会知道它抛出了。这也意味着您没有在异常的堆栈跟踪中获得辅助方法。
顺便说一句,作为发现这个的人的参考,我相信问题中的帮助方法旨在使用这些:保留属性:确定调用者信息。
推荐阅读
- python - python中read_text的用途和目的是什么
- java - 项目构建错误:不可解析的 POM /pom.xml:实体引用名称不能包含字符 ='(位置:已看到 START_TAG ...)
- c# - UWP VisualStateManager.GotoState 无法正常工作
- python - 比较列表中元组的第二个元素
- python - 如何更改 Spyder Python 版本
- mod-rewrite - mod_rewrite 正在将多个请求发送回 Lucee 服务器
- go - 如何在 golang 中验证图像 url?
- linux - 如何使用 $ 和 ',' '.' 对列进行排序 签署bash命令行?
- java - 没有为 jar 文件设置 777 权限
- elixir - 从启动中排除混合项目中的应用程序