Здравствуйте, Kolesiki, Вы писали:
K>Я вот перечитал трэд и всё ещё считаю, что никого этот NonNull не спасёт — этих предупреждений будет СЛИШКОМ МНОГО, чтобы честно на них реагировать.
Если сделать правильно, то никаких предупреждений не будет, будет ошибка компиляции в том месте, где идет вызов потенциально нуллабельного объекта.
public class MyObj
{
public void Go()
{
// ...
}
}
public class MyClass
{
private MyObj Foo()
{
// ...
}
private [NotNull] MyObj Bar()
{
// ...
}
public void Test()
{
var fooResult = Foo();
// ошибка компиляции! fooResult может быть равно null
//fooResult.Go();
// а вот так - работает
if (fooResult != null)
fooResult.Go();
var barResult = Bar();
// работает без всяких проверок, так как barResult гарантированно не равен null
barResult.Go();
}
}
}
Вообще по уму надо бы конечно инвертировать — атрибут должен быть не NotNull, а Null. А not null должен быть у всех параметров по умолчанию. Короче так же, как и с value-типами.
Для компиляции старого говнокода ввести ключ -crapcode, который будет компилять в старом режиме.
Однако что-то мне подсказывает, что сделают через жопу и действительно будет убогое говно с предупреждениями (каким сейчас являются контракты).