c# 通过泛型构造循环引用

c# struct cycled reference via generic

定义结构时,很明显结构字段的值不能是结构本身。此外,当定义 2 个结构并且每个结构都有另一个字段类型时,问题实际上是相同的。

但是,当不是直接设置类型而是对该类型使用泛型时,为什么这仍然是一个问题?

public struct Generic<T> { }
public struct Test1
{
  Generic<Test2> f;
}


public struct Test2
{
  Generic<Test1> f;
}

这段代码可以很好地编译并生成一个 dll。当我尝试加载 dll 时,我得到 'Unable to load one or more of the requested types..' 并仅列出具有上述关系的那些类型。如果我只删除其中一个字段,则加载成功。这是怎么回事以及如何解决这个问题?

我也注意到只要我有这个循环泛型类型,dotnet test explorer 就找不到任何测试,但我认为这是同样的问题。

编辑:

以上代码可以编译成.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。

我同意,这应该行得通。但事实并非如此。这是关于运行时如何加载类型的 known issue

解决这个问题显然需要重写类型加载方式的核心实现。导致可能影响大部分现有程序的行为发生重大变化。到目前为止,解决此问题的成本被认为太高,不值得这样做。