Code.NotNull проблемы с аннотацией
От: _NN_ www.nemerleweb.com
Дата: 22.10.18 08:01
Оценка:
Как только добавляется в код 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);
        }
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.