Все нижеперечисленное верно? Это свойства класса, созданного для _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. Спасибо.
#2 и #3 идентичны...? это просто сокращение от Nullable<T>. № 1 говорит вам, что сама коллекция может быть нулевой.
# 1 кажется синтаксической ошибкой, ?
там не требуется, это не обнуляемое целое
public List<int> _Int1 = null;
=> вы можете дать нулевое значение списку
Для _Int1
список может быть нулевым, но любые элементы в этом списке не могут быть нулевыми. Для _Int2
список не может быть нулевым, но элементы в списке могут быть нулевыми.
Спасибо всем за ваш вклад. Я получаю это сейчас. 1 заключается в том, что этот список можно обнулить. 2 и 3 в том, что это список, но список может содержать Nullable... но тогда в чем разница между 2/3 и списком без каких-либо элементов внутри?
Обратите внимание, что T?
может означать две разные вещи:
T
есть struct
, то T?
есть Nullable<T>
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: Извини, я не слежу за тобой. List<T>
всегда может быть пустым (список не null
, но не содержит элементов); но вы можете сказать, что это не должно быть null
. Объявления List<int?>
и List<Nullable<int>>
одинаковы (короткая и длинная формы одного типа: список целочисленных элементов, допускающих значение NULL)
_int2 и _Int3 идентичны и описывают список, элементы которого могут быть нулевыми или целыми. _Int1 — это переменная, которая может быть нулевой или ссылаться на список целых чисел.