Работя върху разширение Roslyn за предупреждение срещу незащитен .Value
достъп до Nullable<T>
стойности.
Това осигурява следното поведение:
Това разширение вече донякъде работи, но кодът за тестване дали достъпът е „безопасен“ е нещо като хак. Сега просто преминавам през синтактичното дърво, търся if
изявления.
Този подход е доста грозен и произвежда куп невалидни предупреждения.
Ето няколко примера за случаи, при които достъпът x.Value
трябва да е безопасен:
int y;
int? x = foo();
y = x != null ? x.Value : 42;
if (x > 4)
y = x.Value;
if (x != null && someExpr) // With && only one branch needs to be a test
y = x.Value;
if (x == 3 || x == 4) // With || both branches must be a test
y = x.Value;
if (x == null) return; // Exit method body before access .Value
y = x.Value;
Има ли начин да използвате SemanticModel
, за да напишете правилно този тест?
Едно от нещата, за които мисля, е да направя Абстрактна интерпретация върху синтактичното дърво. Но това изглежда като много работа и се надявам, че не е необходим пълноценен абстрактен интерпретатор.
Не съм съвсем сигурен как анализът на мъртъв код се прилага в Roslyn, но изглежда донякъде свързан с това.
&&
, а не||
- person SLaks   schedule 06.05.2014