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);
但是,此函数返回显式引用转换值。我应该会看到类似 The Implicit Reference 值的东西。
答案 0 :(得分:2)
这是一个复杂的过程。
{GetTypeByMetadataName("System.Collections.Generic.List
1“)`返回开放通用类型,实际上是一种类型构造函数,可用于创建具有特定参数的封闭通用类型。
谈论开放通用类型之间的转换没有任何意义;如果将A<>
声明为B<>
或更复杂的关系,则两种类型B<>
和B<T> : A<List<T>
可能具有不同的可转换性。
您只能检查共享相同类型参数的 closed 泛型类型之间的可转换性。为此,请调用Construct()
并为类型参数传递类型。