使用Roslyn提取方法时参数带global::前缀,为何与Visual Studio不同?
为什么Roslyn提取方法生成
global::System.Int32[]而Visual Studio生成int[]? 问题场景
使用Roslyn的CSharpExtractMethodService提取方法时,生成的新方法参数类型是global::System.Int32[];但用Visual Studio提取相同代码时,参数类型是简洁的int[]。
原始代码
using System; public class Program { public static void Main(string[] args) { var list = new int[] {3, 2, 1 }; foreach(var i in list) Console.WriteLine(i); } }
Roslyn提取后的结果
using System; public class Program { public static void Main(string[] args) { var list = new int[] { 3, 2, 1 }; NewMethod(list); } private static void NewMethod(global::System.Int32[] list) { foreach (var i in list) Console.WriteLine(i); } }
注:参数类型为完全限定的global::System.Int32[],而Visual Studio提取后会是int[]
使用的Roslyn代码
var options = new ExtractMethodGenerationOptions() {CodeGenerationOptions = CodeGenerationOptions.GetDefault(document.Project.Services), ExtractOptions = new() { DontPutOutOrRefOnStruct = true}} var service = new CSharpExtractMethodService() as IExtractMethodService; var extract = await service.ExtractMethodAsync(document, span, false,options, CancellationToken.None); var result = extract.DocumentWithoutFinalFormatting;
差异原因
- Roslyn的
DocumentWithoutFinalFormatting返回的是未经代码格式化和命名简化的原始生成代码,它会保留类型的完全限定名称(包括global::前缀),这是Roslyn内部生成代码时的原始状态,确保类型引用绝对明确,避免命名冲突。 - Visual Studio在执行提取方法操作时,除了调用Roslyn的提取逻辑,还会自动触发后续的代码格式化和简化步骤:包括将
System.Int32替换为C#内置别名int,移除不必要的global::前缀,让代码更符合日常编写习惯。 - 你的代码中仅获取了未格式化的结果,没有调用Roslyn的格式化器来处理代码,这是导致差异的直接原因。如果需要和Visual Studio一致的输出,需要在提取后调用Roslyn的代码格式化API对结果进行处理。
内容的提问来源于stack exchange,提问作者Darko
相关产品推荐
相关产品推荐

