"DoesNotReturn" 属性的编译器错误
Compiler Error With "DoesNotReturn" Attribute
我在网络标准 2.1 (C# 8.0) 项目中实现了一些静态抛出辅助方法。
[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}.");
}
但编译器仍然 return 错误 CS0161:“并非所有代码路径 return 一个值”
先写异常路径:
public static BitmapSource GetBitmapSource(String uri)
{
if (!Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
{
Throw.InvalidOperation( $"Invalid uri {uri}.");
}
return new BitmapImage(_uri);
}
现在,就编译器而言,方法 returns.
要考虑的另一件事是让辅助方法 return 异常,而不是抛出它。调用它的方法可以抛出它。这样编译器就会知道它抛出。这也意味着您没有在异常的堆栈跟踪中获得辅助方法。
顺便说一句,供发现此问题的人参考,我相信问题中的辅助方法旨在使用这些:Reserved attributes: Determine caller information.
我在网络标准 2.1 (C# 8.0) 项目中实现了一些静态抛出辅助方法。
[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}.");
}
但编译器仍然 return 错误 CS0161:“并非所有代码路径 return 一个值”
先写异常路径:
public static BitmapSource GetBitmapSource(String uri)
{
if (!Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
{
Throw.InvalidOperation( $"Invalid uri {uri}.");
}
return new BitmapImage(_uri);
}
现在,就编译器而言,方法 returns.
要考虑的另一件事是让辅助方法 return 异常,而不是抛出它。调用它的方法可以抛出它。这样编译器就会知道它抛出。这也意味着您没有在异常的堆栈跟踪中获得辅助方法。
顺便说一句,供发现此问题的人参考,我相信问题中的辅助方法旨在使用这些:Reserved attributes: Determine caller information.