.NET 6 Preview 7 泛型数学功能运行时抛出TypeLoadException异常
问题根因
你遇到的是.NET 6预览版通用数学接口的已知缺陷,IAdditionOperators等静态接口成员相关特性在.NET 6中处于预览阶段,你引用的6.0.0-preview.7.21377.19版本的System.Runtime.Experimental包存在编译期校验和运行时校验不一致的问题:
- 编译期仅检查类型是否存在对应签名的加法运算符,不会校验静态成员的虚方法标记是否和接口要求匹配
- 运行时加载类型时会严格校验接口定义的虚静态方法
op_Addition的实现标记,所以会抛出TypeLoadException
解决方案
方案1(推荐):升级到.NET 7及以上正式版本
静态接口成员和通用数学接口在.NET 7已经完成正式发布,不存在该缺陷,修改项目配置如下即可:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <LangVersion>11</LangVersion> <TargetFramework>net7.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" /> <PackageReference Include="MSTest.TestAdapter" Version="2.2.10" /> <PackageReference Include="MSTest.TestFramework" Version="2.2.10" /> <PackageReference Include="coverlet.collector" Version="3.2.0" /> </ItemGroup> </Project>
修改点说明:
- 移除
EnablePreviewFeatures配置,该特性已正式开放无需预览标识 - 移除预览包
System.Runtime.Experimental的引用,对应接口已包含在.NET 7官方基础库中 - 升级测试相关依赖包到适配.NET 7的版本,避免测试运行兼容性问题
方案2(临时兼容.NET 6)
如果必须留在.NET 6环境下,可以修改运算符实现的显式匹配逻辑,如下:
public class Foo : IAdditionOperators<Foo, Foo, Foo> { static Foo IAdditionOperators<Foo, Foo, Foo>.operator +(Foo left, Foo right) => new(); }
注意该方案使用的是预览特性,.NET 6官方已经停止对该预览功能的维护,可能存在其他未知兼容性问题。
内容的提问来源于stack exchange,提问作者Nigel
相关产品推荐
相关产品推荐

