Как только добавляется в код Code.NotNull, то ReSharper перестает считать, что элементы не null
static void f([CanBeNull][ItemNotNull] List<object> l)
{
if(f==null) throw new Exception();
var o = l[0].ToString(); // Нет проблем, элементы не null
}
static void g([CanBeNull][ItemNotNull] List<object> l)
{
Code.NotNull(l,"a");
var o = l[0].ToString(); // А теперь: Possible NullReferenceException
}
Как вариант можно решить через [ContractAnnotation("arg:null => halt")], но я не очень в этом силён и буду рад услышать улучшения.
До:
[DebuggerHidden, MethodImpl(AggressiveInlining)]
[AssertionMethod]
public static void NotNull<T>(
[CanBeNull, NoEnumeration, AssertionCondition(AssertionConditionType.IS_NOT_NULL)] T arg,
[NotNull, InvokerParameterName] string argName) where T : class
{
if (arg == null)
throw CodeExceptions.ArgumentNull(argName);
}
После:
[DebuggerHidden, MethodImpl(AggressiveInlining)]
[AssertionMethod]
[ContractAnnotation("arg:null => halt")]
public static void NotNull<T>(
[CanBeNull, NoEnumeration] T arg,
[NotNull, InvokerParameterName] string argName) where T : class
{
if (arg == null)
throw CodeExceptions.ArgumentNull(argName);
}