从模糊的新声明中获取可能的泛型类型列表

时间:2014-05-24 00:11:01

标签: c# generics roslyn

我目前正在尝试使用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);
}

相反,它似乎匹配具有最少类型参数的类型。在这种情况下获取所有可用类型的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您想在该位置获取名为“A”的所有可用类型,您应该做的是调用LookupSymbols,如下所示:

var symbols = compilation.GetSemanticModel(tree).LookupSymbols(newA.Span.Start, name: "A");

我认为为什么你没有得到你期望的候选符号,因为编译器没有把它当作含糊不清的。相反,它是你的A&lt;,添加&gt;隐式地,然后将它作为通用名称绑定到arity 1。