Вы используете values
и должны использовать data
для ссылки на один элемент в вашем внутреннем списке, поэтому вместо:
if values=='w':
у вас будет
if data=='w':
В среднесрочной перспективе «кодовые контракты» (в 4.0) будут лучшим ответом на это. Они доступны в настоящее время (с академическими или коммерческими лицензиями), но будут более интегрированы в VS2010. Это может обеспечить как статический анализ, так и поддержку во время выполнения.
(edit) пример:
Contract.RequiresAlways( x != null );
Простой как так ... механизм контрактов кода работает на уровне IL, поэтому он может анализировать это и выдавать предупреждения / ошибки из вызывающего кода во время сборки, или во время выполнения. Для обратной совместимости, если у вас есть существующий код проверки, вы можете просто сообщить ему, где заканчивается проверка работоспособности, и он сделает все остальное:
if ( x == null ) throw new ArgumentNullException("x");
Contract.EndContractBlock();
Это можно сделать либо с помощью AOP , посредством чего Совет во время выполнения проверяет, является ли параметр метода нулевым и допустимы ли нулевые значения. См. PostSharp и Spring.NET для AOP.
Что касается ReSharper, см. Annotated Framework :
Мы проанализировали большую часть .NET Framework Class Library, а также NUnit Framework и аннотировали ее через внешние XML-файлы, используя набор пользовательских атрибутов из пространства имен JetBrains.Annotations, в частности:
- StringFormatMethodAttribute (для методов, которые принимают строки формата в качестве параметров)
- InvokerParameterNameAttribute (для методов со строковыми литеральными аргументами, которые должны соответствовать одному из параметров вызывающего абонента)
- AssertionMethodAttribute (для методов утверждения)
- AssertionConditionAtribute методов утверждения)
- TerminatesProgramAttribute (для методов, которые завершают поток управления)
- CanBeNullAttribute (для значений, которые могут быть нулевыми)
- NotNullAttribute (для значений, которые не могут быть нулевыми)