Здравствуйте, Разраб, Вы писали:
Р>Здравствуйте, vmpire, Вы писали:
V>>Здравствуйте, Разраб, Вы писали:
Р>>>Подчеркивания раздражают. V>>А что за подчёркивания? У меня не подчёркивает Р>
Так может быть это предупреждения от Nullable reference types?
Если не хотите ими пользоваться — отключите для всего проекта.
Если будете пользоваться — замените "User" на "User?" в возвращаемом типе.
Здравствуйте, vmpire, Вы писали:
V>Здравствуйте, Разраб, Вы писали:
Р>>Здравствуйте, vmpire, Вы писали:
V>>>Здравствуйте, Разраб, Вы писали:
Р>>>>Подчеркивания раздражают. V>>>А что за подчёркивания? У меня не подчёркивает Р>>
V>Так может быть это предупреждения от Nullable reference types? V>Если не хотите ими пользоваться — отключите для всего проекта. V>Если будете пользоваться — замените "User" на "User?" в возвращаемом типе.
Это понятно, но зачем ругаться? User ссылочный тип следовательно null допустимое значение для множества юзеров.
Здравствуйте, Разраб, Вы писали:
V>>Так может быть это предупреждения от Nullable reference types? V>>Если не хотите ими пользоваться — отключите для всего проекта. V>>Если будете пользоваться — замените "User" на "User?" в возвращаемом типе. Р>Это понятно, но зачем ругаться? User ссылочный тип следовательно null допустимое значение для множества юзеров.
В том то и дело, что при включении NRT значение null становится недопустимым для типа User (который reference type), оно допустимо только для User?
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Разраб, Вы писали:
V>>>Так может быть это предупреждения от Nullable reference types? V>>>Если не хотите ими пользоваться — отключите для всего проекта. V>>>Если будете пользоваться — замените "User" на "User?" в возвращаемом типе. Р>>Это понятно, но зачем ругаться? User ссылочный тип следовательно null допустимое значение для множества юзеров.
G>В том то и дело, что при включении NRT значение null становится недопустимым для типа User (который reference type), оно допустимо только для User?
Я знаю про nullable только вот он как раз и не может быть null, а обычного class null валидное значение.
Здравствуйте, Разраб, Вы писали:
Р>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Разраб, Вы писали:
V>>>>Так может быть это предупреждения от Nullable reference types? V>>>>Если не хотите ими пользоваться — отключите для всего проекта. V>>>>Если будете пользоваться — замените "User" на "User?" в возвращаемом типе. Р>>>Это понятно, но зачем ругаться? User ссылочный тип следовательно null допустимое значение для множества юзеров.
G>>В том то и дело, что при включении NRT значение null становится недопустимым для типа User (который reference type), оно допустимо только для User? Р>Я знаю про nullable только вот он как раз и не может быть null, а обычного class null валидное значение.
Прочитайте внимательно по ссылке выше.
V>>Так может быть это предупреждения от Nullable reference types? V>>Если не хотите ими пользоваться — отключите для всего проекта. V>>Если будете пользоваться — замените "User" на "User?" в возвращаемом типе. Р>Это понятно, но зачем ругаться? User ссылочный тип следовательно null допустимое значение для множества юзеров.
Прочитайте обоснование введение Nullable reference types и просто погуглите по этим словам. На эту тему было довольно много споров, не вижу смысла их тут дублироватаь.
Кратко — это опциональная дополнительная статическая проверка на допустимость null в конкретном контексте. То, что явно не помечено, как "допустимо null" по умолчанию выдаёт предупреждение.
У вас явно не помечено, потому и ругается.
Считаете эту проверку бессмысленной — отключите (свойства проекта, раздел build) и не парьтесь.
Здравствуйте, Разраб, Вы писали:
Р>Подчеркивания раздражают. Юнион типы завезли уже? Р>Флажки не канают.
Есть два распространенных способа решения этой задачи.
Способ №1:
public User? TryGetUser(int id)
{
if (id < 1)
return null;
...
}
Способ №2:
public bool TryGetUser(int id, [MaybeNullWhen(false)] out User user)
{
if (id < 1)
{
user = null;
return false;
}
...
}
Есть и третий способ, это использование Optional<T>. Эту конструкцию предоставляют некоторые библиотеки-фреймворки для .NET:
public Optional<User> TryGetUser(int id)
{
if (id < 1)
return Optional.None<User>();
...
return Optional.Some(user);
}
// и пример использованияvar user = TryGetUser(1);
if (user.HasValue)
AddPermissionFor(user.Value);
Это пожалуй и всё. Мой самый предпочитамый способ — это способ №1, но и другие тоже приходится иногда использовать.
Здравствуйте, Разраб, Вы писали:
A>>Это пожалуй и всё. Мой самый предпочитамый способ — это способ №1, но и другие тоже приходится иногда использовать.
Р>Второй с тасками не работает. так что мимо. Р>Первый да, но ведь оно и до ? работало. Р>Усложняют шарп до крестов. Потом каятся будут.
Практический смысл вот этого всего в комфортной работе совместно с патерн мачингом. В C# уже достаточно для этого средств даже для существующих типов. Здесь.
Хотя специализированный тип не помешал бы. Но боюсь, в MS опять как всегда накосячат.
Если нам не помогут, то мы тоже никого не пощадим.