Проверка искрового двигателя - PullRequest
0 голосов
/ 11 марта 2010

Мы используем spark для генерации HTML-писем. При объединении наших данных в шаблон я заметил разницу между

<if condition="Equals(#context.UserAccount.Country,'BE')">
  <p>You live in Belgium</p>
</if>
<else>
  <p>You don't live in Belgium</p>
</else>

и

<if condition="#context.UserAccount.Country == 'BE'">
  <p>You live in Belgium</p>
</if>
<else>
  <p>You don't live in Belgium</p>
</else>

Когда я передаю учетную запись пользователя со страной, для которой задано «BE», первая печатает правильно «Вы живете в Бельгии», вторая выдает неверный результат.

Может кто-нибудь сказать мне, почему? Можете ли вы проверить равенство строк без использования Equals ()?

1 Ответ

1 голос
/ 26 марта 2010

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

    CS0252: Warning as Error: Possible unintended reference comparison; 
    to get a value comparison, cast the left hand side to type 'string'

Глядя на код, который генерирует Spark, ошибки и поведение, которые вы видите, имеют гораздо больше смысла. Первый фрагмент кода генерирует следующее сравнение:

    if (Equals(Eval("context.UserAccount.Country"),"BE"))

Я почти уверен, Eval возвращает что-то типа object (независимо от того, какой тип переменной является действительным). Тогда вызов Equals, вероятно, эквивалентен следующему:

    Eval("context.UserAccount.Country").Equals("BE")

, который затем использует перегруженный метод equals для строкового класса (спасибо, полиморфизм), который возвращает true. Где в качестве второго случая:

    if (Eval("context.UserAccount.Country") == "BE")

, вероятно, просто выполняет сравнение ссылок между двумя объектами, которое возвращает false.

Если вы не используете # до context.UserAccount.Country, Spark сгенерирует следующий код (обратите внимание на отсутствие вызова Eval):

    if (context.UserAccount.Country == "BE")

Предполагая, что context имеет свойство UserAccount, которое имеет свойство Country типа string, тогда выражение должно корректно принимать значение true, когда Country имеет значение "BE".

...