【问题标题】:How is the Assembly.Load(Assembly) never null?Assembly.Load(Assembly) 如何永远不会为空?
【发布时间】:2021-10-17 03:03:01
【问题描述】:

在 NET Core 3.1 中

https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.load?view=netcore-3.1#System_Reflection_Assembly_Load_System_Reflection_AssemblyName_

Assembly.Load(Assembly) 的返回值如何永远不会为空?我收到的代码提示是表达式 (Assembly.Load(Assembly) != null) 始终为真。 Assembly 是引用类型吗?

                if (env.IsDevelopment())
                {
                    var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                    if (appAssembly != null)
                    {
                        config.AddUserSecrets(appAssembly, optional: true);
                    }
                }

【问题讨论】:

  • 它看起来(从文档和你的波浪线)它要么返回一个有效的程序集,要么它会抛出一个异常。请注意,它可能会抛出一系列异常
  • 您使用的是哪个 IDE?我无法在我的 VS(without resharper) 中得到这个,尽管 Rider 报告了它。
  • 至于为什么——可能是因为如果返回的程序集只有在加载失败的情况下才能为空,这将导致异常。
  • 我使用 Resharper

标签: c# .net-core-3.1


【解决方案1】:

.NET 核心:

这是因为source code 中的这一行,它有效地告诉编译器这个值不为空。静态代码分析见documentation

return retAssembly!;

所以你会得到一个非空值或异常。

.NET 框架:

那是因为source code 有合约:

public static Assembly Load(AssemblyName assemblyRef)
{
    Contract.Ensures(Contract.Result<Assembly>() != null);
    //More code
}

所以你要么得到一个非空的返回值,要么得到一个异常。

【讨论】:

  • 您的源代码适用于.NET Framework,.NET Core(OP 使用)version 不使用代码契约
  • @GuruStron 已编辑
猜你喜欢
  • 2021-09-09
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多