首页 > 解决方案 > 带有“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"

标签: c#code-analysisc#-8.0

解决方案


先写出异常路径:

public static BitmapSource GetBitmapSource(String uri)
{
    if (!Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
    {
        Throw.InvalidOperation( $"Invalid uri {uri}.");
    }

    return new BitmapImage(_uri);
}

现在,就编译器而言,该方法返回。


要考虑的另一件事是让辅助方法返回异常,而不是抛出异常。调用它的方法可以抛出它。这样编译器就会知道它抛出了。这也意味着您没有在异常的堆栈跟踪中获得辅助方法。


顺便说一句,作为发现这个的人的参考,我相信问题中的帮助方法旨在使用这些:保留属性:确定调用者信息


推荐阅读