【发布时间】:2022-01-07 15:01:14
【问题描述】:
在定义结构时,很明显结构字段的值不能是结构本身。此外,当定义 2 个结构并且每个结构都具有另一个的字段类型时,问题实际上是相同的。
但是当不是直接设置类型 one 而是使用泛型而不是该类型时,为什么这仍然是个问题?
public struct Generic<T> { }
public struct Test1
{
Generic<Test2> f;
}
public struct Test2
{
Generic<Test1> f;
}
此代码编译良好并生成一个 dll。当我尝试加载 dll 时,我得到“无法加载一个或多个请求的类型..”并仅列出具有上述关系的那些类型。如果我只删除其中一个字段,则加载成功。发生了什么以及如何解决这个问题?
我还注意到,只要我有这个循环的泛型类型,dotnet 测试资源管理器就找不到任何测试,但我认为这是同样的问题。
编辑:
上面的代码可以编译成.dll文件。然后,从另一个项目中,我使用 System.Runtime.Loader 动态加载 dll:
public static void Main(string[] args)
{
var context = new AssemblyLoadContext("context");
Assembly assembly = context.LoadFromAssemblyPath("path-to-dll");
Type[] types = assembly.GetTypes();
}
在示例的最后一行,我得到了 ReflectionTypeLoadException。
【问题讨论】:
-
“发生了什么事?”存储一个 Test2 需要多少字节?
-
好吧,实际上没有,因为 Generic
是空的。但即使它有一些原语,大小也是已知的 -
等等,什么? sharplab.io/… 这感觉就像一个错误。也许会提出问题github.com/dotnet/runtime?
-
更简单的情况
Test1 { Generic<Test1> f; }也失败了。 -
我已经打开了github问题here
标签: c# generics struct dynamic-import