首页 > 解决方案 > Assembly.Load(Assembly) 如何永远不会为空?

问题描述

在 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);
                    }
                }

在此处输入图像描述

标签: c#.net-core-3.1

解决方案


.NET 核心:

那是因为源代码中的这一行,它有效地告诉编译器这个值不为空。请参阅此处的静态代码分析文档

return retAssembly!;

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

.NET 框架:

那是因为源代码有一个契约:

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

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


推荐阅读