Имеет странную проблему. Это случалось несколько раз за эти годы, но я никогда не мог понять, почему. Всегда решал его, переставляя код, который у меня был на месте, но хотел бы знать, есть ли более правильный способ справиться с ним или, по крайней мере, выяснить, что стоит за ним.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;
}
}
Что такое 'DataArray'? Действительно ли это тип ценности? – Oded
Каков тип 'CacheData'? – Cameron
Эти блоки не совпадают - у вас есть DataArray frame = cache.CacheData' в первом, а DataArray frame = cache.Frame - во втором. Кроме того, кроме того, что оператор '==' перегружен, я также проверил бы для типов ['implicit'] (http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx) типов. – Kobi