微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有“DoesNotReturn”属性的编译器错误

如何解决带有“DoesNotReturn”属性的编译器错误

我在一个网络标准 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:“并非所有代码路径都返回值”

解决方法

先写异常路径:

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

    return new BitmapImage(_uri);
}

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


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


顺便说一句,作为发现此问题的人的参考,我相信问题中的辅助方法旨在使用这些:Reserved attributes: Determine caller information

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。