【问题标题】:Roslyn SemanticModel.GetTypeInfo(SyntaxNode node).Type returns nullRoslyn SemanticModel.GetTypeInfo(SyntaxNode node).Type 返回 null
【发布时间】:2023-03-05 06:56:02
【问题描述】:

我有一段这样的代码:

using System;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace TestProject
{
    class Program
    {
        private const string text = @"
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            if (args == null) { }
            if (args != null) { }
        }
    }";
        static void Main(string[] args)
        {
            var tree = CSharpSyntaxTree.ParseText(text);
            var compilation = CSharpCompilation.Create(null).AddSyntaxTrees(tree);
            var semanticModel = compilation.GetSemanticModel(tree);
            var root = tree.GetRoot();

            foreach (var param in root.DescendantNodes().OfType<ParameterSyntax>().ToList())
            {
                var type = param.Type;
                var name = param.Identifier;
                var typeSymbol = semanticModel.GetTypeInfo(param).Type;
            }
        }
    }
}

我的目标是能够检查一个类型是否是引用类型。我想这样做

typeSymbol.IsReferenceType

但问题是semanticModel.GetTypeInfo(param).Type 返回null。在同一个param.Type 返回正确的值(string[])。

任何想法为什么它会以这种方式工作以及如何修复它?

【问题讨论】:

    标签: c# .net roslyn roslyn-code-analysis


    【解决方案1】:

    如果目标只是获取参数类型,那么您可以将示例更改为调用semanticModel.GetTypeInfo(type)

    如果您想了解有关参数的所有信息(是否有属性,是否为ref,是否为params,等等...),那么您可能需要使用semanticModel.GetDeclaredSymbol(param)

    【讨论】:

    • 我尝试使用semanticModel.GetDeclaredSymbol(param).Type,然后得到.IsReferenceType。我得到了一件非常有趣的事情:int 类型返回 false .IsValueTypetrue IsReferenceType o_O 当然,这一切都非常令人印象深刻,但是我通常如何检查这是否不起作用。 ..也许还有其他方法?
    • 这听起来很奇怪。随时更新您的问题或使用演示行为的示例代码提出新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2016-02-03
    • 2017-10-20
    相关资源
    最近更新 更多