Roslyn中的INamedTypeSymbol继承关系

INamedTypeSymbol inheritance relation in the Roslyn

我已经使用 GetTypeByMetadataName

为具体类型创建了 INamedTypeSymbol
INamedTypeSymbol listTypeSymbol = context.SemanticModel.Compilation.GetTypeByMetadataName("System.Collections.Generic.List`1");
INamedTypeSymbol collectionTypeSymbol = context.SemanticModel.Compilation.GetTypeByMetadataName("System.Collections.Generic.ICollection`1");

其中一个是List<T>运行时类型的符号,另一个是ICollection<T>运行时类型的符号。 List<T> 类型派生自 ICollection<T>.

类型

如何检查 INamedTypeSymbol 的继承关系?

我尝试使用 ClassifyConversion 方法

Conversion con = context.SemanticModel.Compilation.ClassifyConversion(listTypeSymbol, collectionTypeSymbol);

不过这个函数returns一个显式引用值的转换。我预计会看到类似 隐式引用 值的内容。

这个比较复杂。

GetTypeByMetadataName("System.Collections.Generic.List`1") returns 开放泛型类型,它实际上是一个类型构造函数,可用于创建具有特定参数的封闭泛型类型。

谈论开放泛型类型之间的转换没有意义;如果将 B<> 声明为 B<T> : A<List<T>> 或更复杂的关系,则 A<>B<> 两种类型的转换可能不同。

您只能检查共享相同类型参数的 closed 通用类型之间的可转换性。为此,请调用 Construct() 并为类型参数传递类型。