У Вас почти есть он! способ сделать вложенные понимания списка состоят в том, чтобы поместить эти for
операторы в том же порядке, как они вошли бы регулярный вложенный for
операторы.
Таким образом, это
for inner_list in outer_list:
for item in inner_list:
...
соответствует
[... for inner_list in outer_list for item in inner_list]
, Таким образом, Вы хотите
[image for menuitem in list_of_menuitems for image in menuitem]
Не знаю почему. Но уверены ли вы, что работающее приложение скомпилировано с использованием кода, который вы выполняете. Я видел такие вещи, когда код отличается от того, что на самом деле выполняется.
Вы уверены, что действительно находитесь на выделенной вами линии? Вы можете щелкнуть мышью в окне стека вызовов и сделать любую часть стека вызовов «текущей» строкой в том смысле, что вы можете получить там значения переменных и т. Д.
Дело в том, что, возможно, EndedUsingApplication устанавливает ActiveApplication на null, так что ActiveApplication не было null при оценке if, но теперь оно равно null, когда вы оцениваете его в отладчике.
Вы установили точку останова на строку EndedUsingApplication (ActiveApplication), чтобы убедиться, что ActiveApplication имеет значение null, прежде чем выполнять эту строку?
Является ли ваша программа многопоточной?
Я встречал ситуации, когда я проверял значение, а затем пытался использовать его только для того, чтобы обнаружить, что оно изменилось. Случилось так, что другой поток изменил значение после того, как я его проверил, но до того, как я его использовал.
I think a better approach is to use Object.ReferenceEquals
as it is more explicit:
public static bool operator ==(ActiveApplication a, ActiveApplication b)
{
// same reference so equals is true - will be true for null == null
if (object.ReferenceEquals(a, b))
return true;
// one is null and the other is not
if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null))
return false;
// dealt with all combinations of null - compare fields
return a.process_name == b.process_name && a.window_title == b.window_title;
}
public static bool operator !=(ActiveApplication a, ActiveApplication b)
{
return !(a == b);
}