.NET 拡張関数が XPath/XQuery 条件式内部で使用された場合、複数ある .NET メソッドのうち、どれが呼び出されたのか決定するのに関数の引数に使用されるデータ型が重要になります。
.NET では、以下のルールが適用されます:
•クラス内に同名のメソッドが2つ以上ある場合、呼び出しに使用された引数の数がマッチするメソッドだけが、呼び出される関数の候補に狭められます。
•XPath/XQuery の文字列、数値、boolean データ型は黙示的に対応する .NET データ型へ変換されます(以下のリストを参照)。与えられた XPath/XQuery 型が2つ以上の .NET 型へ変換できる場合(例: xs:integer )、選択されたメソッドにて宣言されている .NET 型が使用されます。例えば、呼び出された .NET メソッドが fx(fouble) で、与えられた XPath/XQuery データ型が xs:integer の場合、 xs:integer が .NET の double データ型へ変換されます。
以下のテーブルに、XPath/XQuery の文字列、数値、boolean 型から .NET データ型へ行われる黙示的な変換リストを示します。
xs:string |
StringValue, string |
xs:boolean |
BooleanValue, bool |
xs:integer |
IntegerValue, decimal, long, integer, short, byte, double, float |
xs:float |
FloatValue, float, double |
xs:double |
DoubleValue, double |
xs:decimal |
DecimalValue, decimal, double, float |
上のリストにある XML スキーマ型(ならびに XPath や XQuery で使用されているデータ型)のサブタイプも、対応する祖先のサブタイプとして .NET のデータ型へ変換されます。
場合によっては、与えられた情報から正しい.NET メソッドを選択することができない場合もあります。例えば、以下のような場合を考えてみましょう:
•与えられた引数が10ある xs:untypedAtomic 値で、mymethod(float) メソッドへ渡されるのを意図している。
•しかし、そのクラスには別のデータ型をとる mymethod(double) というメソッドも存在する。
•メソッド名が同じで、与えられた型 (xs:untypedAtomic) も float と double の両方に変換することができるため、xs:untypedAtomic が float ではなく double に変換される可能性もある。
•結果として、意図したメソッドは選択されず、予期しない動作結果がを招く可能性がある。この問題を回避するには、意図したメソッドを使用するユーザー定義のメソッドを別の名前で新たに作成する必要があります。
上のリストでカバーされていない型(例: xs:date)は変換されずエラーとなります。