Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CSharpScript的Roslyn语义分析';好像不行_C#_Roslyn_Roslyn Code Analysis - Fatal编程技术网

C# CSharpScript的Roslyn语义分析';好像不行

C# CSharpScript的Roslyn语义分析';好像不行,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我正在研究如何对通过Roslyn中的CSharpScript API创建的C#脚本执行语义分析。然而,我所有使用语义模型API的尝试都失败了 这是我的代码,包含了我到目前为止的方法和我尝试过的东西(最初我的脚本声明中有导入和引用传递的选项,但这些似乎并没有改变我的结果) scriptscript=CSharpScript.Create(“intx=2;x+=1;”); script.Compile();//这似乎无关紧要 Compilation=script.GetCompilation();

我正在研究如何对通过Roslyn中的CSharpScript API创建的C#脚本执行语义分析。然而,我所有使用语义模型API的尝试都失败了

这是我的代码,包含了我到目前为止的方法和我尝试过的东西(最初我的脚本声明中有导入和引用传递的选项,但这些似乎并没有改变我的结果)

scriptscript=CSharpScript.Create(“intx=2;x+=1;”);
script.Compile();//这似乎无关紧要
Compilation=script.GetCompilation();
SyntaxTree SyntaxTree=compilation.SyntaxTrees.Single();
SyntaxNode syntaxTreeRoot=syntaxTree.GetRoot();
SemanticModel SemanticModel=compilation.GetSemanticModel(syntaxTree);
var firstVariable=syntaxTreeRoot.genderantnodes().OfType().First();
IEnumerable firstVariableParents=firstVariable.祖先();
IEnumerable diag=semanticModel.GetSyntaxDiagnostics();
IEnumerable declDiag=semanticModel.GetDeclarationDiagnostics();
SymbolInfo variableSymbol=semanticModel.GetSymbolInfo(第一个变量);
ISymbol variableDecl=semanticModel.GetDeclaredSymbol(第一个变量);
int断点=0;
我尝试过从树中获取各种不同类型的语法节点,当我从语义模型中请求时,没有任何东西能给我任何实际的符号信息。例如,当我在VS调试器的断点声明中停止这段代码时,diag和declDiag的长度为0,variableDecl为null,variablesymble的候选项为零


任何建议都将不胜感激

要获取变量声明的符号,只需对变量类型调用
GetSymbolInfo
,如下所示:

var variableSymbol = semanticModel.GetSymbolInfo(firstVariable.Type);

这将返回
int
类型的符号。

根据Roslyn问题追踪器上Cyrus Najmabadi的说法:

VariableDeclarationSyntax引用整个声明。i、 e:int i,j,k。所以问你从中得到了什么“声明符号”在C#中没有意义。您需要获取单个的“VariableDeclarator”,并在其上请求GetDeclaredSymbol


一旦我使用VariableDeclaratorSyntax而不是VariableDeclarationSyntax,我就得到了我所需要的。

感谢您的反馈,但结果是一样的。
var variableSymbol = semanticModel.GetSymbolInfo(firstVariable.Type);