Информация об изменениях

Сообщение Re[5]: C# 7: non-null - кому от него легче? от 02.12.2016 17:04

Изменено 02.12.2016 17:12 AlexRK

Здравствуйте, 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();
    }
}
}



Однако что-то мне подсказывает, что сделают через жопу и действительно будет убогое говно с предупреждениями (каким сейчас являются контракты).
Re[5]: C# 7: non-null - кому от него легче?
Здравствуйте, 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, который будет компилять в старом режиме.

Однако что-то мне подсказывает, что сделают через жопу и действительно будет убогое говно с предупреждениями (каким сейчас являются контракты).