0

我们使用 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”的 UserAccount 时,第一个正确打印“你住在比利时”,第二个会产生不正确的结果。

有人能告诉我为什么吗?你可以在不使用 Equals() 的情况下测试字符串的相等性吗?

4

1 回答 1

1

因此,当我尝试运行您发布的代码时,它会引发编译器错误。但是,我得到的错误解释了为什么您会看到不同的行为。我得到他的错误:

    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。

如果不使用#before context.UserAccount.Country,Spark 将生成以下代码(注意缺少对 的调用Eval):

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

假设context有一个UserAccount属性,它有一个Country字符串类型的属性,那么当 Country 的值为“BE”时,表达式应该正确地计算为 true。

于 2010-03-26T01:42:08.320 回答