我使用的是 roslyn 分析器,它可以处理
async Task<T>
对对象变量的装箱,例如:
int GetValue() => ...
void Print(object value) => Console.WriteLine(value);
void Main() {
Print(GetValue());
}
如果你改变:
-int GetValue() => ...
+Task<int> GetValue() => ...
分析仪应该发出警告。
我实际上已经处于编码的最后阶段,只想在某个位置优化我的代码:
我有一个
IsGenericTaskType
方法,转移到它的ITypeSymbol
被分析为System.Threading.Tasks.Task'1
,但通过字符串比较我实际上不喜欢。
ChatGPT 答案:
type as INamedTypeSymbol)?.ConstructedFrom.SpecialType == SpecialType.System_Threading_Tasks_Task_T;
但是由于 CS1061 我无法访问
SpecialType.System_Threading_Tasks_Task_T
..
有没有可能的方法来比较我的类型符号而不使用字符串?
您可以使用
.editorconfig
,而不是为此编写分析器:https://stackoverflow.com/a/53973220/9080566
如果您无论如何都想要一个分析器,我建议只查看该方法是否使用
async
关键字声明,并完全忽略返回类型。 (也许只是跳过 async void
方法。)C# 中的异步方法可以返回符合编译器识别模式的任何类型,例如 ValueTask<T>
。
通过字符串比较我实际上不喜欢。
如果您确实想检查
Task<T>
,字符串比较似乎是最好的选择 - 它速度很快,并且您希望分析器能够这样做。这个官方的 VS 分析器也使用字符串比较:reference,definition
typeSymbol.Name == nameof(Task) && typeSymbol.BelongsToNamespace(Namespaces.SystemThreadingTasks)