Roslyn建议方法使用不正确的符号

时间:2017-03-03 08:17:47

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

刚刚在VS2015社区(以及VS2017 RC)中看到了

[

public class Class1 { public static void Bar() { } public static void Foo(int n) { Bar. } } 后,建议使用以下自动完成功能。

  • (参数)int n
  • MemberwiseClone
  • 等于
  • 的GetHashCode
  • 的GetType
  • 的ToString

我认为后4种方法(来自Bar.)是有道理的,因为我可以稍后添加名为object的变量/字段,但我看不到Bar和{{1任何意义。顺便说一句,Rider在这里有正确的行为。为了确保它不是IDE特定的问题,我尝试通过

从Roslyn获得完成
(parameter) int n

我的第一次尝试

MemberwiseClone

但我只得到一个名为namespace Microsoft.CodeAnalysis.Recommendations { public static class Recommender { public static Task<IEnumerable<ISymbol>> GetRecommendedSymbolsAtPositionAsync( SemanticModel semanticModel, int position, Workspace workspace, OptionSet options = null, CancellationToken cancellationToken = default(CancellationToken)); } } 的推荐完成。

然后我在硬盘上创建了一个真实的解决方案/项目,上面有 var code = @" namespace IntellisenseTest { public class Class1 { public static void Bar() { } public static void Foo(int n) { Bar. } } }"; var intellisense = "Bar."; var sourceText = SourceText.From(code); var syntaxTree = CSharpSyntaxTree.ParseText(sourceText); var compilation = CSharpCompilation.Create("IntellisenseTest").AddSyntaxTrees(syntaxTree); var semanticModel = compilation.GetSemanticModel(syntaxTree); var position = code.IndexOf(intellisense) + intellisense.Length + 1; var workspace = MSBuildWorkspace.Create(); var symbols = await Recommender.GetRecommendedSymbolsAtPositionAsync( semanticModel, position, workspace); //print symbols

第二次尝试

n

Q1:上述两种实现之间有什么区别? IMO我应该得到相同的结果。

Q2:为什么罗斯林推荐这些完成? IMO string codevar solutionPath = @"C:\workspace\IntellisenseTest\IntellisenseTest.sln"; var fileName = "Class1.cs"; var intellisense = "Bar."; var workspace = MSBuildWorkspace.Create(); var solution = await workspace.OpenSolutionAsync(solutionPath); var project = solution.Projects.First(); var document = project.Documents.Single(d => d.Name == fileName); var text = await document.GetTextAsync(); var position = text.ToString().IndexOf(intellisense) + intellisense.Length + 1; var syntaxTree = await document.GetSyntaxTreeAsync(); var compilation = await project.GetCompilationAsync(); var semanticModel = compilation.GetSemanticModel(syntaxTree); var symbols = await Recommender.GetRecommendedSymbolsAtPositionAsync( semanticModel, position, workspace); //print symbols I got n ToString Equals GetHashCode GetType MemberwiseClone 没有任何意义。

1 个答案:

答案 0 :(得分:0)

A2 :所有建议的完成都是System.Object methods,C#中的所有类型都来源于此。

A1 :您没有对手动构建的msbuild工作区中定义System.Object的程序集的引用。带有.sln的那个可能有它。

首次尝试时,将其添加到项目中

project = project.AddMetadataReference(
    MetadataReference.CreateFromFile(typeof(System.Object).Assembly.Location));

或汇编

compilation = compilation.AddReferences(
    MetadataReference.CreateFromFile(typeof(System.Object).Assembly.Location));

你应该得到相同的结果。