如何在Roslyn中用var替换字符串变量?对于像这样的局部声明:stringa=string.Empty;如何编写诊断将其更改为:vara=string.Empty;我已经将代码修复与诊断放在一起。这是有趣的部分:从ISyntaxNodeAnalyzer实现AnalyzeNodepublicvoidAnalyzeNode(SyntaxNodenode,SemanticModelsemanticModel,ActionpublicvoidAnalyzeNode(SyntaxNodenode,SemanticModelsemanticModel,ActionaddDiagnostic,CancellationTokencancellationToken){varlocalDeclaration=(LocalDeclarationStatementSyntax)node;if(localDeclaration.Declaration.Type.IsVar)return;varvariable=localDeclaration.Declaration.Variables.First();varinitialiser=variable.Initializer;if(initialiser==null)返回;varvariableTypeName=localDeclaration.Declaration.Type;varvariableType=semanticModel.GetTypeInfo(variableTypeName).ConvertedType;varinitialiserInfo=semanticModel.GetTypeInfo(variable.Initializer.Value);vartypeOfRightHandSideOfDeclaration=initialiserInfo.Type;if(Equals(variableType,typeOfRightHandSideOfDeclaration)){addDiagnostic(Diagnostic.Create(Rule,node.GetLocation)(),localDeclaration.Declaration.Variables.First().Identifier.ValUE));这基本上是查看声明两侧的类型,如果它们相同(并且RHS不是var),则添加一个诊断这是代码修改的代码:publicasyncTask>GetFixesAsync(Documentdocument,TextSpanspan,IEnumerablediagnostics,CancellationTokencancellationToken){varroot=awaitdocument.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);vardiagnosticSpan=diagnostics.First().Location.SourceSpan;vardeclaration=root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf().OfType().First();returnnew[]{CodeAction.Create("Usevar",c=>ChangeDeclarationToVar(document,declaration,c))};}privateasyncTaskChangeDeclarationToVar(Documentdocument,LocalDeclarationStatementSyntaxlocalDeclaration,CancellationTokencancellationToken){varroot=awaitdocument.GetSyntaxRootAsync(cancellationToken);varvariableTypeName=localDeclaration.Declaration.Type;varvarTypeName=SyntaxFactory.IdentifierName("var").WithAdditionalAnnotations(Formatter.Annotation);varnewDeclaration=localDeclaration.ReplaceNode(variableTypeName,varTypeName);变量newRoot=root.ReplaceNode(localDeclaration,newDeclaration);返回document.WithSyntaxRoot(newRoot);这个很简单,直接从Syntaxfactory中获取var,然后切换出来注意var在SyntaxFactory中没有自己的静态方法,所以是通过名称来引用的。你不能。var关键字告诉编译器进行类型推断,并且只使用vara;编译器没有足够的信息来推断类型。但是,您可以执行以下任何操作vara=newString();varb=String.Empty;varc="";但这似乎比它值得的更多努力。编辑更新请求:为什么我要修改所有代码以使用var声明?不管怎样,它都会编译成相同的IL(简单示例)://vara=String.Empty;IL_0000:ldsfld字符串[mscorlib]System.String::EmptyIL_0005:pop//stringb=String.Empty;IL_0006:ldsfldstring[mscorlib]System.String::EmptyIL_000b:pop编译器无法从中推断类型。你需要使用:vara="";//compilercanseethatistype`string`:或者你可以这样做:所有的内容分享,如果对你有用,需要了解更多的C#学习教程,希望大家多多关注——stringA;如需转载请注明出处:
