В чем разница между нулем и (типом) пустым? - PullRequest
0 голосов
/ 07 сентября 2018

Примечание: ЭТО НЕ ДУБЛИКАТ. Этот вопрос спрашивает, почему вообще можно разыграть ноль, у меня вопрос, в чем разница между null и (type)null для начала.


В этой ссылке (из ссылки MSDN C #) говорится, что этот код:

expression as type 

эквивалентен этому коду («за исключением того, что переменная expression вычисляется только один раз»):

expression is type ? (type)expression : (type)null  

Это заставило меня задуматься, какой смысл в нулевом кастинге? Чем это отличается от:

expression is type ? (type)expression : null  

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Посмотрите на этот пример проекта:

static void Main(string[] args)
{
    //Error: The call is ambigious between the following methods or properties: ShowMessage(FirstClass), ShowMessage(SecondClass)
    ShowMessage(null);
    //Here it is known which type is being used
    ShowMessage((FirstClass)null);
}

private static void ShowMessage(FirstClass value)
{
    System.Console.WriteLine(value);
}

private static void ShowMessage(SecondClass value)
{
    System.Console.WriteLine(value.ToString());
}

class FirstClass { }
class SecondClass { }

Для этого null и (FirstClass)null - это не одно и то же. С (FirstClass)null вы явно определяете его как обнуляемый тип FirstClass (class обнуляется как ссылочный тип), который является нулевым. Другой null просто ... хорошо null и должен быть неявно приведен к нужному типу, допускающему значение Nullable.

Осторожно: Если вы замените

ShowMessage(NotFirstClassObj as FirstClass)

с

ShowMessage(NotFirstClassObj is Firstclass ? (FirstClass)NotFirstClassObj : null)

Это все еще работает, потому что компилятор все еще может получить правильный тип. Но это может быть причиной того, что это (type)null в документальном фильме.

0 голосов
/ 07 сентября 2018

Документация гласит, что The code is equivalent to ключевое слово equivalent. Вы можете удалить приведение, и результат будет таким же, как и эквивалентный expression as type, но зачем указывать все возможные функциональные эквивалентности?


в чем разница между null и (type)null для начала с

В этом случае нет никакой разницы. Они приравнивают к одному и тому же. Автор , вероятно, решил использовать (type)null, потому что он более четко показывает, как работает as.

...