13,230
回編集
(→浮動小数点型) |
|||
| 93行目: | 93行目: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
ジェネリックを使用して型パラメータを導入する場合、<br> | |||
上記のサンプルコードにおいて、<u>public static T Add<T, U>(this T m, U n)</u>では、2つの型パラメータTとUを使用している。<br> | |||
これにより、メソッドは様々な数値型の組み合わせに対応することができる。<br> | |||
<br> | |||
* 制約 | |||
*: <code>where <型パラメータ> : <制約 1>, <制約 2>, <制約 3>, ...</code> | |||
*: <br> | |||
*: <u>where T : struct, IConvertible</u> | |||
*: <u>where U : struct, IConvertible</u> | |||
*: <br> | |||
*: これらの制約により、TとUは値型 (struct) であり、かつ、IConvertibleインターフェースを実装している必要がある。 | |||
*: これは、ほとんどの数値型 (int, float, double等) に当てはまる。 | |||
*: <br> | |||
* <code>dynamic</code>キーワード | |||
*: dynamic a = m; | |||
*: dynamic b = n; | |||
*: <code>dynamic</code>キーワードを使用することにより、コンパイル時ではなく実行時に型チェックが行われる。 | |||
*: これにより、異なる型同士の加算を可能にしている。 | |||
*: <br> | |||
* 戻り値 | |||
*: return a + b; | |||
*: 動的に型が決定された変数aとbを加算して、その結果を返す。 | |||
*: 戻り値の型は、Tになる。 | |||
<br> | |||
このアプローチのメリットは、1つのメソッドで多くの数値型の組み合わせに対応できることである。<br> | |||
例えば、float型とint型、double型とlong型等の組み合わせでも使用することができる。<br> | |||
<br> | |||
ただし、このアプローチにはいくつかの注意点がある。<br> | |||
* <code>dynamic</code>キーワードの使用により、型安全性が部分的に失われる。 | |||
* パフォーマンスが若干低下する可能性がある。 | |||
* オーバーフローのチェックが行われないため、大きな数値を扱う場合は注意が必要である。 | |||
<br> | <br> | ||