Одна из моих команд недавно встретила интересный глюк в матрице. Если кто-нибудь сможет объяснить это, это будет здорово. Возможно, это сложно объяснить, так что несите меня.
Мы создаем приложение ASP.Net. В нем мы имеем простую инструкцию "if".
Guid adminId = Guid.Empty;
if (mRoles.Contains("Admin"))
{
adminId = mUserId;
}
(где mRoles - это список и содержит "Admin" )
Это работает так, как ожидалось (например, adminID назначается mUserId). Однако при переписывании использовать тернарный оператор ниже этого нет! (adminID назначается Guid Empty)!
Guid adminId = mRoles.Contains("Admin") ? mUserId : Guid.Empty;
Разработчик, который обнаружил это, находится на 64-битной машине (IIS7/64-разрядная перспектива), и если он изменит свои настройки в IIS следующим образом... В разделе "Пул приложений по умолчанию" > "Дополнительные настройки" установите флажок "Включить 32-разрядные приложения". Теперь оба утверждения работают!
Мы считаем, что это возможно сделать с тем, что Guid является структурой, а не классом, и что значение каким-то образом смещается под 64-разрядный процесс.
Я подозреваю, что проблема подобна этой... http://www.mail-archive.com/[email protected]/msg00164.html Это может объяснить, почему работает первый простой оператор if. (поскольку создание переменной adminId возможно создание указателя, а тернарный оператор - нет?)
Если кто-нибудь может пролить свет на это, это будет здорово. Это ошибка совместимости? или наше непонимание объединения трехмерных операторов и структур?
Спасибо.
UPDATE
Объедините простое приложение и не сможете воспроизвести его в совершенно новом проекте, поэтому оно должно быть чем-то иным, чем GUID.
//Работает (назначает mUserId для adminId)
Guid adminId = true ? mUserId : Guid.Empty;
//Не работает (даже если t == true!!!!???)
bool t = (mRoles.Contains("TenantAdmin");
Guid adminId = t ? mUserId : Guid.Empty;
Думаю, мы вернемся к чертежной доске. Спасибо всем за вашу помощь, и если мы получим еще больше, я отправлю обратно сюда снова.
Единственное, что, возможно, было не слишком ясным, это то, что mRoles не является строкой Generic List of Type. Это строка [], а метод Contains() - метод расширения LINQs, если это имеет какое-то значение, но не может понять, почему: -?
ОБНОВЛЕНИЕ 2
Мы посмотрели на IL, и это правильно (и теперь работает с перерывами!). Мы обнаружили, что, когда пул приложений по умолчанию загружает больше приложений, он снова начинает сбой. Единственное, о чем мы можем думать, это то, что некоторые из этих других приложений могут содержать какой-то неуправляемый код, который каким-то образом мешает нашему приложению, возможно ли это?