Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
Либо я чего-то еще не понимаю, либо следует списать на возможную сырость превьюхи компилятора.
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();
        }
    }
}

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

Уважаемые зрители, кто-нибудь уже втыкает в C# 8 настолько, чтобы объяснить мне чтоэтозанах?
29 май 19, 17:00    [21897070]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
Немного поэкспериментировал, и такое впечатление, что после любого сравнения на null - не-null переменная начинает почему-то рассматриваться как nullable. Похоже, что это и вправду какой-то косяк компилятора.
29 май 19, 19:26    [21897169]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
Пройдись отладчиком по компилятору!
29 май 19, 23:05    [21897290]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
fkthat
Уважаемые зрители, кто-нибудь уже втыкает в C# 8 настолько, чтобы объяснить мне чтоэтозанах?


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

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

Смысл от использования фичи Nullable reference types может быть достигнут только в одном единственном случае. Нужно переключить режим компилятора CS8604 с Warning на Error.
29 май 19, 23:15    [21897292]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
fkthat
Немного поэкспериментировал, и такое впечатление, что после любого сравнения на null - не-null переменная начинает почему-то рассматриваться как nullable. Похоже, что это и вправду какой-то косяк компилятора.


Может быть и косяк, но сравнение с null заведомо не-null аргумента должен вызывать вопросы.
29 май 19, 23:16    [21897293]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

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

Позвольте заметить, неправда ваша. В-первых ворнинг вызывает не сравнение с null (я же специально в коде пометил, где именно ворнинг). Во-вторых, даже в доках указано, что использование nonnullable references не отменяет необходимости проверок на null во многих случаях. Компилятор осуществляет только статический анализ nonnullable, он никак не гарантирует, что метод не сможет быть вызван с null параметром и не вставляет никаких проверок на это. Например, метод может быть вызван вообще из другой сборки, которую собрали с опцией nullable disable, или вообще из какой-нибудь легаси сборки. Даже в случае если все и везде включено, то комилятор все равно всего лишь выдает ворнинг, который легко можно игнорировать. Т.е. по-любому для public методов доступных извне проверки делать надо.

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

#nullable disable
Foo(null);
#nullable restore

public void Foo(string s)
{
    // ....
}
29 май 19, 23:43    [21897304]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
fkthat
Позвольте заметить, неправда ваша. В-первых ворнинг вызывает не сравнение с null (я же специально в коде пометил, где именно ворнинг). Во-вторых, даже в доках указано, что использование nonnullable references не отменяет необходимости проверок на null во многих случаях. Компилятор осуществляет только статический анализ nonnullable, он никак не гарантирует, что метод не сможет быть вызван с null параметром и не вставляет никаких проверок на это.


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


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


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


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


Это костыли :) Просто слишком поздно подсуетились. Но можно выиграть на новом проекте. Правда ещё сыровато.
29 май 19, 23:52    [21897311]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
hVostt
Это костыли :) Просто слишком поздно подсуетились. Но можно выиграть на новом проекте. Правда ещё сыровато.


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

Foo(null!); // <== "null-forgiven" operator "!"

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


На самом деле, лучше бы они возродили свой "Code Contracts". Статический анализ там, конечно, тормозил безбожно и работал очень далеко не всегда, но в остальном была шикарная штука.
30 май 19, 00:04    [21897319]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
fkthat
Можно проще, без прагмовских извратов:


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


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


Да чёт как-то не взлетело. Я уже много лет пользую и насаждаю JetBrains.Annotations в проектах, от чего ошибок типа Null referenced exception мы получаем намного реже, чем с попытками огородиться проверками. Проверки максимум дают информацию, но не предупреждают проблемы.
30 май 19, 00:15    [21897323]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
fkthat,

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

        [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();
        }
30 май 19, 00:22    [21897325]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
Сон Веры Павловны
Member

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

Ну, судя по референссоурсу, у себя внутри фреймворка они его и сейчас вполне используют - видимо, особо никакого возрождения и не требуется.
А вообще, по моему скромному, сабж - странная штука. Какая-то неуклюжая попытка что-то сделать так, как надо было делать ровно наоборот: non-nullable reference types с синтаксисом типа
void Foo(string! s) {...}

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

А так - какая-то попытка размазать масло масляное (nullable reference types).
30 май 19, 06:16    [21897362]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
Сон Веры Павловны,

Под .NET Framework Code Contracts вроде бы до сих пор работает, но он уже прикрыт и не развивается. Для Core уже не работает. Тема там еще в том, что сам класс "System.Diagnostics.Contracts.Contract" везде есть, но без утилиты "CCRewrite" он бесполезен, т.к. это просто класс-заглушка - его вызовы служат только маркерами для инструментирования сборки после компиляции.
30 май 19, 06:48    [21897368]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
https://praeclarum.org/2018/12/17/nullable-reference-types.html
30 май 19, 09:39    [21897473]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
ЕвгенийВ
https://praeclarum.org/2018/12/17/nullable-reference-types.html

Да... Что-то мне все больше кажется, что вся эта шляпа с nullable-ами, что автары в МС затеяли, на самом деле, бесполезна чуть более, чем совсем.
30 май 19, 11:23    [21897545]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
Без существенного улучшения системы типов и введения монад c# обречен.
30 май 19, 11:37    [21897565]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
В общем-то, ожидается, что в финальной версии компилятора эта фича все равно будет по-умолчанию отключена ("nullable disabled") и её можно будет только руками включить в свойствах проекта или внеся изменения в csproj файл. М.б. будет включена в шаблоны проектов для C#.
30 май 19, 13:50    [21897687]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
ЕвгенийВ
Без существенного улучшения системы типов и введения монад c# обречен.


F#? Там вроде бы null-ов нет вообще.
30 май 19, 13:51    [21897688]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6179
hVostt
fkthat
Уважаемые зрители, кто-нибудь уже втыкает в C# 8 настолько, чтобы объяснить мне чтоэтозанах?


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

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

Безотносительно C#8, вместо string отлично передается null, как объектный тип )

Попытка подстелить соломку ?
30 май 19, 13:56    [21897697]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
hVostt

Может быть и косяк, но сравнение с null заведомо не-null аргумента должен вызывать вопросы.

Ни каких вопросов :)
DateTime dateTime = default;
            var b = dateTime == null;
30 май 19, 14:02    [21897700]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
Немного поэкспериментировал, и такое впечатление, что после любого сравнения на null - не-null переменная начинает почему-то рассматриваться как nullable. Похоже, что это и вправду какой-то косяк компилятора.

Компилятор прошелся вверх и обнаружил, что переменной нигде не мог присвоиться null, а тут ты вруХ и сравниваешь. Он начинает считать, а вдруг ты прав....
30 май 19, 14:04    [21897705]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat

F#? Там вроде бы null-ов нет вообще.

Немного есть.
30 май 19, 14:09    [21897707]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
ЕвгенийВ,

Да, но они там вроде бы, типа как, "unsafe" контекст в C#. Я, впрочем, F# вообще не знаю - слышал просто краем уха.
30 май 19, 15:19    [21897759]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
На то пошло, там нет циклов и переменных и вообще никаких рудиментов вроде классов, соответственно solid и всякие IoC в топку.
30 май 19, 15:43    [21897782]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
ЕвгенийВ
На то пошло, там нет циклов и переменных и вообще никаких рудиментов вроде классов, соответственно solid и всякие IoC в топку.


А это что?
30 май 19, 15:54    [21897798]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
fkthat
А это что?

Это аппендикс необходимый для совместимости с остальными .NET языками.
30 май 19, 16:15    [21897821]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4801
ЕвгенийВ
На то пошло, там нет циклов и переменных и вообще никаких рудиментов вроде классов, соответственно solid и всякие IoC в топку.

На то пошло, F# - это абсолютно совсем другая парадигма. Сравнивать его с C#.. ну, это примерно как C# сравнивать с SQL.
30 май 19, 16:25    [21897833]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
Сон Веры Павловны
Какая-то неуклюжая попытка что-то сделать так, как надо было делать ровно наоборот: non-nullable reference types с синтаксисом типа
void Foo(string! s) {...}


Это сильно противоречит имеющемся синтаксису nullable типов. Изначально мне тоже казалось, что non-nullable лучший вариант, и может уживаться с текущим кодом. Но нет. Библиотеки должны быть обратно совместимы.

А string! это совершенно новый тип, его протаскивать надо везде. В аргументах, в свойствах и локальных переменных. Поэтому не катит.
30 май 19, 21:52    [21898039]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
Siemargl
Безотносительно C#8, вместо string отлично передается null, как объектный тип )

Попытка подстелить соломку ?


Статическая проверка типов. Всё по феншую. Изначально ссылочные типы шли вразрез с этой идеей.
30 май 19, 21:54    [21898042]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
ЕвгенийВ
Ни каких вопросов :)
DateTime dateTime = default;
            var b = dateTime == null;


Это костыль )
30 май 19, 21:55    [21898044]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
hVostt
А string! это совершенно новый тип, его протаскивать надо везде. В аргументах, в свойствах и локальных переменных. Поэтому не катит.

string? тоже надо, я выше давал ссылку, где чувак описывает случаи.
30 май 19, 22:02    [21898053]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
hVostt
ЕвгенийВ
Ни каких вопросов :)
DateTime dateTime = default;
            var b = dateTime == null;


Это костыль )

Не костыль. Сам недавно чудом узнал, что если у структуры переопределен == то на сравнение с null компилятор не ругается )
30 май 19, 22:04    [21898056]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
ЕвгенийВ
Не костыль. Сам недавно чудом узнал, что если у структуры переопределен == то на сравнение с null компилятор не ругается )


Там дело не в переопределении, по-моему. Просто структура отбоксится в object а потом сравнится с null.
30 май 19, 22:23    [21898068]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
fkthat
Member

Откуда:
Сообщений: 1139
fkthat
ЕвгенийВ
Не костыль. Сам недавно чудом узнал, что если у структуры переопределен == то на сравнение с null компилятор не ругается )


Там дело не в переопределении, по-моему. Просто структура отбоксится в object а потом сравнится с null.


Нет, я был не прав, там все еще хитрее. Ругаться компилятор не ругается, но все равно поступает умно и сравнение просто сразу же заменяет на false.
30 май 19, 22:33    [21898073]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
ЕвгенийВ
string? тоже надо, я выше давал ссылку, где чувак описывает случаи.


ну ок, смотрим:

public SomeType! SomeMethod(int a, string b, ClassType! t1, StructType t2)
{
}


Если бы МС пошли на такое, это был бы знатный фейл. Хорошо, что не облажались )
31 май 19, 00:09    [21898118]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
ЕвгенийВ
Не костыль. Сам недавно чудом узнал, что если у структуры переопределен == то на сравнение с null компилятор не ругается )


Собственно в этом и есть костыль, реализованный через переопределение )
31 май 19, 00:10    [21898119]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4801
hVostt
А string! это совершенно новый тип

Ну да, аналогично было, когда вводились nullable value types.
hVostt
его протаскивать надо везде. В аргументах, в свойствах и локальных переменных. Поэтому не катит.

Зачем? Когда вводились nullable value types, никто везде массово не менял int на int?, и не протаскивал Nullable<T> везде. Новая фича - для новых проектов, и рефакторинга старых по мере необходимости и наличия свободного времени. Старая остается на своем месте, и с ней работают по-старому.
31 май 19, 06:10    [21898147]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4801
fkthat
ЕвгенийВ
Не костыль. Сам недавно чудом узнал, что если у структуры переопределен == то на сравнение с null компилятор не ругается )


Там дело не в переопределении, по-моему. Просто структура отбоксится в object а потом сравнится с null.

Ответ Липперта.
31 май 19, 07:30    [21898159]     Ответить | Цитировать Сообщить модератору
 Re: C# 8 preview: Nullable reference types  [new]
hVostt
Member

Откуда:
Сообщений: 15381
Сон Веры Павловны
hVostt
А string! это совершенно новый тип

Ну да, аналогично было, когда вводились nullable value types.


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

Сон Веры Павловны
Зачем? Когда вводились nullable value types, никто везде массово не менял int на int?, и не протаскивал Nullable<T> везде.


Не скажи. Менял object на Nullable<T>. И протаскивал :)

Сон Веры Павловны
Старая остается на своем месте, и с ней работают по-старому.


Обратная совместимость должна быть не только синтаксическая, но и семантическая.

int => int?
string => string?

логично? да.

int => int?
!string => string

херень какая-то. особенно для классов и структур.
31 май 19, 21:28    [21899217]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / WinForms, .Net Framework Ответить