For example I have the code:
using System.Linq;
namespace MyNamespace
{
class Person
{
public string Name { get; set; }
}
class Program
{
static void Main()
{
string name = new Person().Name; // SemanticModel.GetTypeInfo() returns string. It's OK.
string[] names = new Person[] { new Person() }.Select(p => p.Name).ToArray(); // SemanticModel.GetTypeInfo() returns ErrorTypeSymbol.
names = new Person[] { new Person() }.Select(Person p => p.Name).ToArray(); // SemanticModel.GetTypeInfo() returns string. It's OK.
}
}
}
I want to get TypeInfo for p.Name from lambda expression of LINQ Select extension.
I'm writing in my Roslyn analyzer:
syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray();
And I got:
[0] = {MemberAccessExpressionSyntax} new Person().Name
[1] = {MemberAccessExpressionSyntax} new Person[] { new Person() }.Select(p => p.Name).ToArray
[2] = {MemberAccessExpressionSyntax} new Person[] { new Person() }.Select
[3] = {MemberAccessExpressionSyntax} p.Name
Then I'm trying to get TypeInfo for the first MemberAccessExpressionSyntax new Person().Name:
context.Compilation.GetSemanticModel(syntaxTree).GetTypeInfo(syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray()[0]).Type.Name
It returns String. It's OK.
But when I'm trying to get type of MemberAccessExpression from lambda expression Select(p => p.Name):
context.Compilation.GetSemanticModel(syntaxTree).GetTypeInfo(syntaxTree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().ToArray()[3]).Type.Name
It returns empty string.
How to get TypeInfo from SemanticModel for MemberAccessExpressionSyntax from lambda expression without explicit type declaration?