2012-07-23 21 views
11

谁能想到这将会检测到以下错误ReSharper的良好格局:ReSharper的模式来检测算术可空类型

decimal? x = null; 

decimal? y = 6M; 

var total = x + y; 

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

我试图创建一个模式,但我不能工作,如何快速处理所有类型的算术(例如+, - ,*等)和任何可空类型(e.g. Nullable<int>, Nullable<decimal>, Nullable<double> etc)。此外,我无法处理交换性(例如它应该检测到x + y以及y + x)。

注意,我不一定需要检测X是否是实际空:只是它是否是可空类型。我想迫使开发人员编写:x.Value + y.Value。

+0

erm nullable只是一个泛型类。 可为空结构 为什么不只是使这种模式thingy:“可为空” – Nahum 2012-07-23 06:21:41

+0

而不要检查一个'x + y'模式,但寻找一个'Nullable ''已确定分配'null'并且在其左侧或右侧(或“ - =”)中没有任何“+”,“ - ”,“*”,“/',”^','*','''','<<','>> ,'+ =',...在它左边)。 – SimpleVar 2012-07-23 06:28:11

+0

@Nahum它不起作用。 – cbp 2012-07-23 06:34:40

回答

3

这不是一个完整的答案,但这是迄今为止我所得出的最好结果。

的模式是:

$obj$ + $nullableObj$ 

OBJ是一个 “System.Object类型的表达或其派生类型之一 nullableObj是一个” 类型System.Nullable的表达“(注意,你不希望nullableObj包含派生类型)

这不是一个很好的解决方案,因为该模式没有处理交换性,所以你需要复制并粘贴和反向表达:

$nullableObj$ + $obj$ 

而且,这种模式只处理小数,所以你需要复制并粘贴它的每类你有兴趣(是的,这可能是很多模式)。

一条好消息:+符号处理加法和减法,所以你不必担心减法。