Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# 8 preview: Nullable reference types / 25 сообщений из 38, страница 1 из 2
29.05.2019, 17:00
    #39819995
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
Либо я чего-то еще не понимаю, либо следует списать на возможную сырость превьюхи компилятора.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Foo
{
    public void Bar(string s)
    {
        Check<ArgumentNullException>(s != null);
        Baz(s); // CS8604 "Possible null reference argument bla-bla-bla"
    }

    public void Baz(string s)
    {
        Console.WriteLine(s);
    }

    private void Check<TException>(bool condition)
        where TException : Exception, new()
    {
        if (!condition)
        {
            throw new TException();
        }
    }
}


В таком случае получаю ворнинг, как в комменте написано.
Ворнинг уходит, если закомментить строку с вызовом
Код: c#
1.
// Check<ArgumentNullException>(s != null);


Уважаемые зрители, кто-нибудь уже втыкает в C# 8 настолько, чтобы объяснить мне чтоэтозанах?
...
Рейтинг: 0 / 0
29.05.2019, 19:26
    #39820045
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
Немного поэкспериментировал, и такое впечатление, что после любого сравнения на null - не-null переменная начинает почему-то рассматриваться как nullable. Похоже, что это и вправду какой-то косяк компилятора.
...
Рейтинг: 0 / 0
29.05.2019, 23:05
    #39820098
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
Пройдись отладчиком по компилятору!
...
Рейтинг: 0 / 0
29.05.2019, 23:15
    #39820100
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthatУважаемые зрители, кто-нибудь уже втыкает в C# 8 настолько, чтобы объяснить мне чтоэтозанах?

Тут же всё очевидно до безобразия.

Так как ты определил тип аргумента как string , а не string? , значит сравнение на null -- бессмысленно, и вызывает абсолютно закономерный warning.

Смысл от использования фичи Nullable reference types может быть достигнут только в одном единственном случае. Нужно переключить режим компилятора CS8604 с Warning на Error.
...
Рейтинг: 0 / 0
29.05.2019, 23:16
    #39820101
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthatНемного поэкспериментировал, и такое впечатление, что после любого сравнения на null - не-null переменная начинает почему-то рассматриваться как nullable. Похоже, что это и вправду какой-то косяк компилятора.

Может быть и косяк, но сравнение с null заведомо не-null аргумента должен вызывать вопросы.
...
Рейтинг: 0 / 0
29.05.2019, 23:43
    #39820105
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
hVosttТак как ты определил тип аргумента как string , а не string? , значит сравнение на null -- бессмысленно, и вызывает абсолютно закономерный warning.
Позвольте заметить, неправда ваша. В-первых ворнинг вызывает не сравнение с null (я же специально в коде пометил, где именно ворнинг). Во-вторых, даже в доках указано, что использование nonnullable references не отменяет необходимости проверок на null во многих случаях. Компилятор осуществляет только статический анализ nonnullable, он никак не гарантирует, что метод не сможет быть вызван с null параметром и не вставляет никаких проверок на это. Например, метод может быть вызван вообще из другой сборки, которую собрали с опцией nullable disable, или вообще из какой-нибудь легаси сборки. Даже в случае если все и везде включено, то комилятор все равно всего лишь выдает ворнинг, который легко можно игнорировать. Т.е. по-любому для public методов доступных извне проверки делать надо.

Вот, в этом коде, например, все с т.з. компилятора будет ок:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
#nullable disable
Foo(null);
#nullable restore

public void Foo(string s)
{
    // ....
}
...
Рейтинг: 0 / 0
29.05.2019, 23:52
    #39820110
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthatПозвольте заметить, неправда ваша. В-первых ворнинг вызывает не сравнение с null (я же специально в коде пометил, где именно ворнинг). Во-вторых, даже в доках указано, что использование nonnullable references не отменяет необходимости проверок на null во многих случаях. Компилятор осуществляет только статический анализ nonnullable, он никак не гарантирует, что метод не сможет быть вызван с null параметром и не вставляет никаких проверок на это.

Причина этому -- поддержка существующего кода. Верно. Вставлять проверки можно с помощью аннотаций и Fody, но в идеале писать весь проект по новым правилам полностью, а внешние библиотеки, которые еще не перешли на эти правила, использовать кастинг и проверки.


fkthatДаже в случае если все и везде включено, то комилятор все равно всего лишь выдает ворнинг, который легко можно игнорировать. Т.е. по-любому для public методов доступных извне проверки делать надо.

Именно, что основная цель -- отсутствие проверок, иначе ценности в этом нет. Кому нужны ворнинги? Нужны ошибки, которые требуется исправить, а не жалкие предупреждения, на которым всем плевать :)


fkthatВот, в этом коде, например, все с т.з. компилятора будет ок:

Это костыли :) Просто слишком поздно подсуетились. Но можно выиграть на новом проекте. Правда ещё сыровато.
...
Рейтинг: 0 / 0
30.05.2019, 00:04
    #39820115
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
hVosttЭто костыли :) Просто слишком поздно подсуетились. Но можно выиграть на новом проекте. Правда ещё сыровато.

Можно проще, без прагмовских извратов:

Код: c#
1.
2.
3.
4.
5.
6.
Foo(null!); // <== "null-forgiven" operator "!"

public Foo(string s)
{
// ...
}



На самом деле, лучше бы они возродили свой "Code Contracts" . Статический анализ там, конечно, тормозил безбожно и работал очень далеко не всегда, но в остальном была шикарная штука.
...
Рейтинг: 0 / 0
30.05.2019, 00:15
    #39820117
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthatМожно проще, без прагмовских извратов:

Это противоречит концепции nullable-типов, которые уже есть. Вообще принят либеральный подход, основанный на предупреждениях компилятора. Хотя я считаю надо было поступать жёстче.


fkthatНа самом деле, лучше бы они возродили свой "Code Contracts" . Статический анализ там, конечно, тормозил безбожно и работал очень далеко не всегда, но в остальном была шикарная штука.

Да чёт как-то не взлетело. Я уже много лет пользую и насаждаю JetBrains.Annotations в проектах, от чего ошибок типа Null referenced exception мы получаем намного реже, чем с попытками огородиться проверками. Проверки максимум дают информацию, но не предупреждают проблемы.
...
Рейтинг: 0 / 0
30.05.2019, 00:22
    #39820118
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthat,

Вот несколько самых примитивных примеров

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        [ContractAnnotation("s:null => true")]
        public static bool IsNullOrEmpty([CanBeNull] this string s)
        {
            return string.IsNullOrEmpty(s);
        }

        [ContractAnnotation("s:null => null; s:notnull => notnull")]
        public static string Limit([CanBeNull] this string s, int maxLength)
        {
            if (maxLength <= 0) throw new ArgumentOutOfRangeException(nameof(maxLength), ErrorMessages.TooLargeString);
            if (s == null) return null;
            return s.Length > maxLength ? s.Substring(0, maxLength) : s;
        }

        public static <#= type #> SumOrDefault([NotNull] this IEnumerable<<#= type #>> source, <#= type #> defaultValue = default)
        {
            return source.DefaultIfEmpty(defaultValue).Sum();
        }
...
Рейтинг: 0 / 0
30.05.2019, 06:16
    #39820139
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthatНа самом деле, лучше бы они возродили свой "Code Contracts" . Статический анализ там, конечно, тормозил безбожно и работал очень далеко не всегда, но в остальном была шикарная штука.
Ну, судя по референссоурсу , у себя внутри фреймворка они его и сейчас вполне используют - видимо, особо никакого возрождения и не требуется.
А вообще, по моему скромному, сабж - странная штука. Какая-то неуклюжая попытка что-то сделать так, как надо было делать ровно наоборот: non-nullable reference types с синтаксисом типа
Код: c#
1.
void Foo(string! s) {...}


(условно)
и соответствующей реакцией компилятора при попытке передать null-значение - аналогичное попытке передать null в
Код: c#
1.
void Foo(int n) {...}


А так - какая-то попытка размазать масло масляное (nullable reference types).
...
Рейтинг: 0 / 0
30.05.2019, 06:48
    #39820144
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
Сон Веры Павловны,

Под .NET Framework Code Contracts вроде бы до сих пор работает, но он уже прикрыт и не развивается. Для Core уже не работает. Тема там еще в том, что сам класс "System.Diagnostics.Contracts.Contract" везде есть, но без утилиты "CCRewrite" он бесполезен, т.к. это просто класс-заглушка - его вызовы служат только маркерами для инструментирования сборки после компиляции.
...
Рейтинг: 0 / 0
30.05.2019, 09:39
    #39820216
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
...
Рейтинг: 0 / 0
30.05.2019, 11:23
    #39820261
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
ЕвгенийВ https://praeclarum.org/2018/12/17/nullable-reference-types.html
Да... Что-то мне все больше кажется, что вся эта шляпа с nullable-ами, что автары в МС затеяли, на самом деле, бесполезна чуть более, чем совсем.
...
Рейтинг: 0 / 0
30.05.2019, 11:37
    #39820266
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
Без существенного улучшения системы типов и введения монад c# обречен.
...
Рейтинг: 0 / 0
30.05.2019, 13:50
    #39820312
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
В общем-то, ожидается, что в финальной версии компилятора эта фича все равно будет по-умолчанию отключена ("nullable disabled") и её можно будет только руками включить в свойствах проекта или внеся изменения в csproj файл. М.б. будет включена в шаблоны проектов для C#.
...
Рейтинг: 0 / 0
30.05.2019, 13:51
    #39820313
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
ЕвгенийВБез существенного улучшения системы типов и введения монад c# обречен.

F#? Там вроде бы null-ов нет вообще.
...
Рейтинг: 0 / 0
30.05.2019, 13:56
    #39820319
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
hVosttfkthatУважаемые зрители, кто-нибудь уже втыкает в C# 8 настолько, чтобы объяснить мне чтоэтозанах?

Тут же всё очевидно до безобразия.

Так как ты определил тип аргумента как string , а не string? , значит сравнение на null -- бессмысленно, и вызывает абсолютно закономерный warning..
...
Безотносительно C#8, вместо string отлично передается null, как объектный тип )

Попытка подстелить соломку ?
...
Рейтинг: 0 / 0
30.05.2019, 14:02
    #39820322
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
hVostt
Может быть и косяк, но сравнение с null заведомо не-null аргумента должен вызывать вопросы.
Ни каких вопросов :)
Код: c#
1.
2.
DateTime dateTime = default;
            var b = dateTime == null;
...
Рейтинг: 0 / 0
30.05.2019, 14:04
    #39820324
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthatНемного поэкспериментировал, и такое впечатление, что после любого сравнения на null - не-null переменная начинает почему-то рассматриваться как nullable. Похоже, что это и вправду какой-то косяк компилятора.
Компилятор прошелся вверх и обнаружил, что переменной нигде не мог присвоиться null, а тут ты вруХ и сравниваешь. Он начинает считать, а вдруг ты прав....
...
Рейтинг: 0 / 0
30.05.2019, 14:09
    #39820325
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthat
F#? Там вроде бы null-ов нет вообще.
Немного есть.
...
Рейтинг: 0 / 0
30.05.2019, 15:19
    #39820354
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
ЕвгенийВ,

Да, но они там вроде бы, типа как, "unsafe" контекст в C#. Я, впрочем, F# вообще не знаю - слышал просто краем уха.
...
Рейтинг: 0 / 0
30.05.2019, 15:43
    #39820366
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
На то пошло, там нет циклов и переменных и вообще никаких рудиментов вроде классов, соответственно solid и всякие IoC в топку.
...
Рейтинг: 0 / 0
30.05.2019, 15:54
    #39820376
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
ЕвгенийВНа то пошло, там нет циклов и переменных и вообще никаких рудиментов вроде классов, соответственно solid и всякие IoC в топку.

А это что?
...
Рейтинг: 0 / 0
30.05.2019, 16:15
    #39820388
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# 8 preview: Nullable reference types
fkthat А это что?
Это аппендикс необходимый для совместимости с остальными .NET языками.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# 8 preview: Nullable reference types / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]