2013-07-08 4 views
8

Рассмотрим этот код:Почему пустая строка не является строкой объекта

class Program 
     { 
      static void Main(string[] args) 
      { 

       string s = null; 
       bool b = s is string; 
       Console.WriteLine(b); 
      } 
     } 

В коде выше s is string но Ь false.

Фактически s как строка, почему я получаю этот результат?

У компилятора такое поведение?

+6

's' не является строкой, это пустая ссылка. Если бы он ссылался на что-то, что-то было бы строкой. –

+3

однако 'bool b = typeof (s) - строка;' даст ожидаемый результат – Robert

+0

no i dont get null refrence –

ответ

5

При оценке вашего утверждения время выполнения должно сначала следовать ссылке, на которую ссылается переменная. Только тогда он может оценить объект, на который ссылается, чтобы определить, действительно ли это строка.

Поскольку ссылка null ссылается на отсутствие объекта, это не строка. На самом деле, это ничто.

Вы можете использовать оператор typeof, чтобы получить объект Type, соответствующий строке, вместо сравнения объекта, на который ссылается, если это ваша конечная цель.

Это на самом деле конкретный пример, приведенный Эрик Липперт в своем блоге на эту же тему:

Я заметил, что это оператор непоследовательны в C#. Проверьте это:

string s = null; // Clearly null is a legal value of type string 
bool b = s is string; // But b is false! 

Что случилось с этим?

- http://ericlippert.com/2013/05/30/what-the-meaning-of-is-is/

+0

Я не вижу, как оператор 'typeof' будет иметь любую помощь в этой ситуации. –

+3

@ m-y Если OP ищет объект типа 'Type', он может использовать' typeof' вместо оператора 'is'. –

2

Переменная s является ссылкой, которая может потенциально указывать на местоположение строки в памяти, однако вы еще не указали ее на строку - она ​​указывает на «null». Когда вы спрашиваете s is string, вы говорите: «ссылается ли ссылка s на местоположение строки в памяти», и в вашем случае ответ «нет».

1

Нулевое ключевое слово является буквальным, который представляет собой пустую ссылку, один, что не относится к любому объекту.

http://msdn.microsoft.com/en-us/library/edakx9da.aspx

s is string является ложным, поскольку s не ссылается на экземпляр string - s является нулевым.

Смежные вопросы