Що таке невідома нульовість у C # 8?


12

У C # 8.0 ми можемо мати зведені типи посилань. Документи стверджують, що існує 4 види зведення нанівець. Перші 3 цілком зрозумілі, але я не розумію точки "невідомого". Документи кажуть, що він використовується з дженериками, але коли я намагаюся викликати метод на необмежену змінну типу Т у генеріках, він просто попереджає, ніби тип є нульовим. Я не бачу різниці між невідомим і нульовим. Чому невідомо існує? Як це проявляється?

Відповіді:


12

Візьміть такий загальний метод:

public static T Get<T>(T value)
{
    return value;
}

Якщо ми називаємо це так Get<string>(s) , повернення не є нульовим, а якщо ми це робимо Get<string?>(s), воно є незмінним.

Однак якщо ви називаєте це загальним аргументом, як Get<T>(x)іT називаєте не вирішено, наприклад, це загальний аргумент для вашого загального класу, як нижче ...

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // is result nullable or non-nullable? It depends on T
    }
}

Тут компілятор не знає, чи зрештою він буде викликаний з нульовим чи ненульовим типом.

Є нове обмеження типу, яке ми можемо використовувати для сигналізації, яке Tне може бути нульовим:

public static T Get<T>(T value) where T: notnull
{
    return value;
}

Однак де T не обмежено і все ще відкрито, зведена нанівець невідомо.

Якщо ці невідомі трактувались як нульові, тоді можна написати наступний код:

class MyClass<T>
{
    void Method(T x)
    {
        var result = Get<T>(x);
        // reassign result to null, cause we we could if unknown was treated as nullable
        result = null;
    }
}

У випадку, коли це Tбуло нерегульованим, нам слід було б отримати попередження. Тож із невідомими типами зведеності ми хочемо попередження при перенаправлення, а також попередження про присвоєння потенційно null.


Коли я роблю var результат = Test.Get <T> (x); result.ToString (); компілятор скаржиться на перенаправлення можливого нульового значення. Я не бачу, чим невідоме відрізняється від просто зведеного в даному випадку.
Stilgar

1
З точки зору попереджень вони поводяться однаково, але вони семантично відрізняються. Ви можете сказати, що різниця є академічною, і якщо це було вашим питанням, я згоден.
Стюарт

1
Я все одно хотів би знати, чому різниця була введена. Дуже дивно вводити таке розрізнення в мові в академічних цілях.
Stilgar

Моє погано, просто перечитайте специфікацію, оновіть відповідь, остання частина пояснює це.
Стюарт

1
Ах, це більше подобається
Stilgar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.