Це питання було предметом мого блогу 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 недійсний, однозначно відповідь - ні!"
Щоб трохи глибше подивитися на своє запитання:
Можна очікувати, що нульове значення належить до будь-якого еталонного (або нульового) типу
Можна неявно припустити, що тип - це набір значень , і сумісність присвоєння значення y зі змінною типу X є нічим іншим, ніж перевіренням, чи є y членом множини x .
Хоча це надзвичайно поширений спосіб дивитися на типи, це не єдиний спосіб дивитися на типи, і це не той спосіб, як C # дивиться на типи. Нульові посилання - це члени не типу C #; сумісність присвоєння - це не просто перевірка набору, щоб побачити, чи містить він значення. Просто тому, що нульова посилання є призначенням сумісним зі змінною еталонного типу X, не означає, що null є членом типу X. Відношення "є призначення, сумісне з" відношенням, а відношення "є членом типу", очевидно, має багато перекриваються, але вони не тотожні в CLR.
Якщо вас цікавлять теорії типів, перегляньте мої останні статті на цю тему:
Що це за річ, яку ви називаєте "типом"? Частина перша
Що це за річ, яку ви називаєте "типом"? Частина друга