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 を渡すと、最初の 1 つは正しく 'You live in Belgium' と出力されますが、2 番目のアカウントは正しくない結果になります。

誰かが理由を教えてもらえますか? 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を返します。2番目のケースとして:

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

おそらく、2 つのオブジェクト間の参照比較を行うだけで、false が返されます。

#beforeを使用しない場合context.UserAccount.Country、Spark は次のコードを生成します ( への呼び出しがないことに注意してEvalください)。

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

context文字列型のプロパティを持つUserAccountプロパティがあると仮定するとCountry、Country の値が "BE" の場合、式は正しく評価されて true になるはずです。

于 2010-03-26T01:42:08.320 に答える