我目前正在尝试使用GetSymbolInfo了解Roslyn对泛型类型的处理。在我看来,如果我对我要使用的泛型类型不明确,我应该得到一个CandidateSymbols列表,但事实并非如此。这是一些测试代码:
[Test]
public void Test_Generic_Type_Ambiguous_Resolution()
{
string code = @"using System;
namespace Test
{
public class A<T1>
{}
public class A<T1,T2>
{}
public class B
{
public void Body()
{
var test = new A<
}
}
}";
var tree = CSharpSyntaxTree.ParseText(code);
var compilation = CSharpCompilation.Create("test")
.AddSyntaxTrees(tree);
var newA = tree.GetRoot().DescendantNodes().OfType<GenericNameSyntax>().First();
var symbol = compilation.GetSemanticModel(tree).GetSymbolInfo(newA);
//This is false, no candidate symbols but an exact match on A<T1>
Assert.That(symbol.CandidateSymbols.Length > 0 && symbol.Symbol == null);
}
相反,它似乎匹配具有最少类型参数的类型。在这种情况下获取所有可用类型的正确方法是什么?
答案 0 :(得分:1)
如果您想在该位置获取名为“A”的所有可用类型,您应该做的是调用LookupSymbols
,如下所示:
var symbols = compilation.GetSemanticModel(tree).LookupSymbols(newA.Span.Start, name: "A");
我认为为什么你没有得到你期望的候选符号,因为编译器没有把它当作含糊不清的。相反,它是你的A&lt;,添加&gt;隐式地,然后将它作为通用名称绑定到arity 1。