我正在尝试使用LinqPad运行Roslyn的代码生成功能。LinqPad的.Dump()扩展方法可将对象呈现为格式化视图,并在结果窗格中显示。
由http://roslynquoter.azurewebsites.net/ 生成的代码包含很多似乎没有什么用处,只会增加臃肿的代码。无论是否注释掉.WithFooToken(...)调用,以下代码都将输出
这些调用是否对所有语言都是可选的,还是仅适用于其Roslyn支持库中具有合理默认值的语言?
由http://roslynquoter.azurewebsites.net/ 生成的代码包含很多似乎没有什么用处,只会增加臃肿的代码。无论是否注释掉.WithFooToken(...)调用,以下代码都将输出
return null;
。using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
var syn =
SyntaxFactory.ReturnStatement(
SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)
// .WithToken(SyntaxFactory.Token(SyntaxKind.NullKeyword))
)
// .WithReturnKeyword(
// SyntaxFactory.Token(SyntaxKind.ReturnKeyword)
// )
// .WithSemicolonToken(
// SyntaxFactory.Token(SyntaxKind.SemicolonToken)
// )
;
syn.NormalizeWhitespace().ToFullString().Dump();
这些调用是否对所有语言都是可选的,还是仅适用于其Roslyn支持库中具有合理默认值的语言?
return /**/ null;
这样的情况下肯定很有用。至于为什么它们总是被包含在内,也许是因为很难区分这两种情况吧? - svickreturn
关键字和分号,因此它们会被默认添加-但是如果分号还没有输入呢?syntax = syntax.WithSemicolonToken(SyntaxFactory.MissingToken(SyntaxKind.SemicolonToken));
- Jeroen Vannevel