C# список, допускающий значение NULL

Все нижеперечисленное верно? Это свойства класса, созданного для _s.

    public List<int>? _Int1 { get; set; }
    public List<int?> _Int2 { get; set; }
    public List<Nullable<int>> _Int3 { get; set; }

Я пробовал все из них, и все это работает. Однако, когда я присваиваю значение, оно должно точно соответствовать тому, как оно было определено, то есть:

        _s._Int1 = new List<int> { 0 } ;
        _s._Int2 = new List<int?> { 0 };
        _s._Int3 = new List<Nullable<int>> { 0 };

Если бы я назначил по-другому, то я получил бы следующее:

        _s._Int1 = new List<int?> { 0 } ;                   // fail
        _s._Int2 = new List<Nullable<int>> { 0 };           // OK
        _s._Int3 = new List<int?> { 0 };                    // OK

Мои вопросы заключаются в том, как правильно объявить Nullable. Спасибо.

_int2 и _Int3 идентичны и описывают список, элементы которого могут быть нулевыми или целыми. _Int1 — это переменная, которая может быть нулевой или ссылаться на список целых чисел.

Klaus Gütter 07.01.2023 17:07

#2 и #3 идентичны...? это просто сокращение от Nullable<T>. № 1 говорит вам, что сама коллекция может быть нулевой.

David L 07.01.2023 17:07

# 1 кажется синтаксической ошибкой, ? там не требуется, это не обнуляемое целое

Nitin Sawant 07.01.2023 17:12
public List<int> _Int1 = null; => вы можете дать нулевое значение списку
Hossein Sabziani 07.01.2023 17:28

Для _Int1 список может быть нулевым, но любые элементы в этом списке не могут быть нулевыми. Для _Int2 список не может быть нулевым, но элементы в списке могут быть нулевыми.

Rick Davin 07.01.2023 18:45

Спасибо всем за ваш вклад. Я получаю это сейчас. 1 заключается в том, что этот список можно обнулить. 2 и 3 в том, что это список, но список может содержать Nullable... но тогда в чем разница между 2/3 и списком без каких-либо элементов внутри?

EBDS 08.01.2023 01:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обратите внимание, что T? может означать две разные вещи:

  1. Если T есть struct, то T? есть Nullable<T>
  2. Если T равно class, то T? означает ссылочный тип, допускающий значение NULL, это означает, что экземпляр не должен быть нулевым.

Пожалуйста, см. https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references для получения подробной информации.

В вашем вопросе int? — это случай № 1, так как int — это struct, когда List<int?> — это случай № 2, поскольку List<T> — это class:

// _Int1 is List<int>
// _Int1 can be null
public List<int>? _Int1 { get; set; } 

// _Int2 is List<Nullable<int>>
// _Int2 is not supposed to be null
public List<int?> _Int2 { get; set; }

// Longer version of _Int2 type declaration
// _Int3 is List<Nullable<int>>
// _Int3 is not supposed to be null
public List<Nullable<int>> _Int3 { get; set; }

Есть ли разница между 2/3 и пустым списком?

EBDS 08.01.2023 01:20

@EBDS: Извини, я не слежу за тобой. List<T> всегда может быть пустым (список не null, но не содержит элементов); но вы можете сказать, что это не должно быть null. Объявления List<int?> и List<Nullable<int>> одинаковы (короткая и длинная формы одного типа: список целочисленных элементов, допускающих значение NULL)

Dmitry Bychenko 08.01.2023 02:31

Другие вопросы по теме