在 Roslyn 诊断分析器中检测隐式转换

Detecting implicit casts in a Roslyn diagnostic analyzer

我想创建一个 Roslyn 诊断分析器来查找隐式转换,特别是像这样的构造:

DateTimeOffset v = new DateTime();

这意味着我要么必须检测隐式转换,要么找到对 DateTimeOffset.op_Implicit(DateTime).

的引用

但问题是 Roslyn 诊断分析器处理语法,而不是语义模型。因此,我能想到的唯一方法是找出所有可能具有隐式转换的语法结构,并对这些结构进行 运行 语义分析。然而,这非常棘手,因为即使我能够创建一个详尽的语法结构列表来生成隐式转换,对语言的更改也很容易引入新的语法结构。

我的问题是是否有替代上述方法的方法。 具体来说,是否可以编写一个 运行 反对语义模型的 Roslyn 诊断分析器? 或者我错过了什么并且有比我上面描述的更好的选择吗?

我认为你在这里是不正确的:

The problem though is that Roslyn diagnostic analyzers work on syntax, not the semantic model.

您可以注册诊断分析器来处理语法、语义模型或​​更高级别的 "operation" 类型。例如,Kasey Uhlenhuth 有一个 example 检测零长度数组的创建。

您可以拨打AnalysisContext.RegisterSemanticModelActionAnalysisContext.RegisterOperationAction。您可能希望注册操作类型为 Conversion 的操作 - 这可能会减少很多工作。