Resharper模式用于检测可空类型的算术运算

11

有没有人能想到一个好的Resharper模式来检测以下错误:

decimal? x = null;

decimal? y = 6M;

var total = x + y;

Console.WriteLine(total); // Result is null

我尝试创建一个模式,但我无法快速处理所有类型的算术(例如+,-,*等)和任何可空类型(例如Nullable<int>、Nullable<decimal>、Nullable<double>等)。同时,我也不能处理交换律(例如它应该检测到x + y以及y + x)。

请注意,我不一定需要检测x是否为null:只需要检测它是否是可空类型。我希望强制开发人员编写:x.Value + y.Value


erm nullable只是一个通用类。 Nullable<T>结构体 为什么不直接在“Nullable<T>”上使用这个模式呢? - Nahum
不要检查 x + y 模式,而是寻找已经被确定赋值为 null 并且左右两侧没有任何 +-*/^*~<<>>(或者在其左侧的 -=+= 等)的 Nullable<T> - SimpleVar
最坏的情况是 - 你为每个支持算术运算的类型复制粘贴模式。尽管你不会考虑其他覆盖了这些运算符的类型...所以,是的,你需要将其泛化。为什么它不能与 Nullable<T> 一起工作? - SimpleVar
@yorye 是的,那绝对是最坏的情况 - 有很多类型支持算术运算,除非我能支持交换律,否则复制和粘贴模式的不同版本数量将迅速增加。 - cbp
@yorye 我不确定我理解你的意思 - 你能举个模式的例子吗? - cbp
很遗憾,我并没有尝试过为ReSharper制作任何模式,所以我对此毫无经验。我只是随意提出了一些想法,希望你或其他人能够好好利用它们。 - SimpleVar
1个回答

3

这不是一个完整的答案,但这是我目前想到的最好的答案。

模式是:

$obj$ + $nullableObj$

obj是“System.Object或其派生类型之一的表达式” nullableObj是“System.Nullable类型的表达式”。(请注意,您不希望nullableObj包括派生类型)。

这不是一个很好的解决方案,因为该模式不能处理可交换性,所以您需要复制并粘贴它并反转表达式:

$nullableObj$ + $obj$

此外,这个模式只处理十进制数,所以你需要为每种感兴趣的类型复制并粘贴它(是的,那可能是很多模式)。
好消息是:加号符号(+)可以处理加法和减法,所以你不需要担心减法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接