2011-12-20 3 views
0

Имеет странную проблему. Это случалось несколько раз за эти годы, но я никогда не мог понять, почему. Всегда решал его, переставляя код, который у меня был на месте, но хотел бы знать, есть ли более правильный способ справиться с ним или, по крайней мере, выяснить, что стоит за ним.Null check возвращает true для ненулевого значения

Неработающий версия:

public bool CaptureFrame(ArrayCache cache) 
{ 
    if (cache == null) 
     throw new ArgumentNullException("cache"); 

    DataArray frame = cache.CacheData; 

    if (frame == null) 
     throw new ArgumentNullException("cache.CacheData"); 


    // do stuff 
} 

Рабочая версия:

public bool CaptureFrame(ArrayCache cache) 
{ 
    if (cache == null) 
     throw new ArgumentNullException("cache"); 

    if (cache.CacheData == null) 
     throw new ArgumentNullException("cache.CacheData"); 

    DataArray frame = cache.CacheData; 


    // do stuff 
} 

Проблема заключается в следующем: рамка не нуль (по крайней мере, в соответствии с отладчиком, а какой-то мере я может проследить код), однако, когда он делает проверку if (frame == null), она получается правдой и выдает исключение. Я переписал для проверки cache.CacheData, и он отлично работает, но он действительно не должен иметь никакого отношения к логике кода.

Мне удалось найти еще один вопрос на сайте с аналогичной проблемой, которая в конечном итоге связана с перегрузкой операторов == и! =. Эти операторы не перегружены для рассматриваемого класса в моем коде, и это автономный класс, поэтому нет ничего, что могло бы наследовать.

Edit: Джон Сондерс просил код для свойства CacheData:

private DataArray cacheData; 

public DataArray CacheData 
{ 
    get 
    { 
     return cacheData; 
    } 
    set 
    { 
     cacheData = value; 
    } 
} 
+2

Что такое 'DataArray'? Действительно ли это тип ценности? – Oded

+1

Каков тип 'CacheData'? – Cameron

+3

Эти блоки не совпадают - у вас есть DataArray frame = cache.CacheData' в первом, а DataArray frame = cache.Frame - во втором. Кроме того, кроме того, что оператор '==' перегружен, я также проверил бы для типов ['implicit'] (http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx) типов. – Kobi

ответ

0

выглядит, как вы картографирование исключения в нерабочем один, то вызывая DataArray кадра = cache.CacheData; , но что, если cache.CacheData, если null, то вы назначаете его DataFrame .. всегда лучше, по моему мнению, сделать проверку на null сначала, прежде чем назначать или предполагать, что ваш второй выглядит нормально .. Предпочитаю вместо того, чтобы выбрасывать исключение, может быть, вы может заманить исключение и попробовать некоторые тестовые примеры для обоих сценариев

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