Почему TKey? разрешить TKey с ограничением notnull, но Nullable с ограничением структуры?C#

Место общения программистов C#
Ответить
Anonymous
 Почему TKey? разрешить TKey с ограничением notnull, но Nullable с ограничением структуры?

Сообщение Anonymous »

Я обнаружил удивительное (для меня) поведение в универсальных шаблонах C#, где TKey? интерпретируется по-разному в зависимости от его ограничения.
Когда TKey : struct, TKey? правильно разрешается в Nullable и по умолчанию принимает значение null. Где TKey : notnull, TKey?, похоже, разрешается просто в TKey, а его значение по умолчанию становится default(TKey).
Вот минимальное консольное приложение:

Код: Выделить всё

new NotNullDemo().CheckField();
new StructDemo().CheckField();

public enum MyEnum { One, Two }
public class NotNullDemo where TKey : notnull
{
private TKey? field;
public void CheckField() => Console.WriteLine(
$"notnull: typeof(TKey?) == {typeof(TKey?).Name} | field == {(field == null ? "null" : field)}"
);
}

public class StructDemo where TKey : struct
{
private TKey? field;
public void CheckField() => Console.WriteLine(
$"struct:  typeof(TKey?) == {typeof(TKey?).Name} | field == {(field == null ? "null" : field)}"
);
}
Вывод:

notnull: typeof(TKey?) == MyEnum | поле == Один
struct: typeof(TKey?) == Nullable`1 | field == null

Почему компилятор C# (или CLR) обрабатывает TKey? как TKey, когда присутствует ограничение notnull, но как Nullable, когда используется ограничение структуры?

Подробнее здесь: https://stackoverflow.com/questions/798 ... letkey-wit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»