Этот вопрос был предметом моего блога 30 мая 2013 года . Спасибо за отличный вопрос!
Ты смотришь на пустую дорогу.
Кто-то спрашивает вас "может ли ваша дорога содержать Honda Civic?"
Да. Да, оно может.
Кто-то указывает вам на вторую дорогу. Это также пусто. Они спрашивают "Может ли текущее содержимое моей дороги вписаться в вашу дорогу?"
Да, очевидно. Обе дороги пусты! Так ясно, что содержимое одного может вписаться в другое, потому что в первую очередь нет содержимого ни того, ни другого.
Кто-то спрашивает вас "Есть ли на вашей дороге Honda Civic?"
Нет.
Вы думаете, что isоператор отвечает на второй вопрос: с учетом этого значения оно вписывается в переменную этого типа? Подходит ли нулевая ссылка в переменную этого типа? Да, это так.
Это не тот вопрос, на который isоператор отвечает. Вопрос, на который isоператор отвечает, является третьим вопросом. y is Xне спрашивает « является yдопустимым значением переменной типа X? », он спрашивает « Является yли допустимая ссылка на объект типа X? » Поскольку нулевая ссылка не является допустимой ссылкой на какой-либо объект любого типа, ответ «нет» ». Эта дорога пуста; это не содержит Honda Civic.
Другой способ взглянуть на это - это y is Xответить на вопрос «если бы я сказал y as X, получу ли я ненулевой результат? Если у ноль, ясно, что ответ - нет!
Чтобы взглянуть немного глубже на ваш вопрос:
Ожидается, что нулевое значение принадлежит любому ссылочному (или обнуляемому) типу
Можно было бы неявно предположить, что тип является набором значений , и что совместимость присваивания значения y с переменной типа X есть не что иное, как проверка того, является ли y членом множества x .
Хотя это чрезвычайно распространенный способ просмотра типов, это не единственный способ просмотра типов, и это не то, как C # смотрит на типы. Пустые ссылки не являются членами типа в C #; Совместимость присваивания - это не просто проверка набора на наличие значения. То, что нулевая ссылка является присваиванием, совместимым с переменной ссылочного типа X, не означает, что null является членом типа X. Отношение «совместимо с присваиванием» с отношением, а отношение «является членом типа», очевидно, имеет много перекрываются, но они не идентичны в CLR.
Если вас интересуют размышления о теории типов, посмотрите мои последние статьи на эту тему:
Что это за вещь, которую вы называете «типом»? Первая часть
Что это за вещь, которую вы называете «типом»? Часть вторая