Все нижеперечисленное верно? Это свойства класса, созданного для _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 — это переменная, которая может быть нулевой или ссылаться на список целых чисел.