読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

続・ nullable な引数を持つメソッドをオーバーロードする場合の解決

C#

何故「暗黙的な変換の原点」が採用されるのか。
この辺はメソッドのオーバーロードに関する言語仕様に因ると思われるので、言語仕様 (C# 3.0) を読んでみました。
「 7.4.3.1 適切な関数メンバ」には、

  • A の引数の数が、関数メンバの宣言におけるパラメータの数と一致する。
  • A の各引数について引数のパラメータ受け渡しモード (つまり、値、ref、または out) が対応するパラメータのパラメータ受け渡しモードと一致し、さらに次のいずれかが成立する。
    • 値パラメータまたはパラメータ配列の場合は、引数から対応するパラメータの型への暗黙の変換 (6.1 を参照) が存在する。
    • ref パラメータまたは out パラメータの場合は、引数の型が対応するパラメータの型と一致する。つまり、ref パラメータと out パラメータはどちらも、受け渡す引数のエイリアスです。

とあるので、まず「暗黙の型変換」が関与している事は間違いなさそうです。
また、「 7.4.3.2 より適切な関数メンバ」で、

  • 各引数について、EX から QX への暗黙の変換が、EX から PX への暗黙の変換よりも適切ではない。
  • 少なくとも 1 つの引数について、EX から PX への変換の方が、EX から QX への変換よりも適切である。

の場合に「より適切である」とされています。
では、何を以って「引数の暗黙の変換がより適切である」とするのかと云うと、その先に、

MP が MQ よりも限定的なパラメータ型を持つ場合は、MP は MQ よりも適切である。

とあるので、型が限定的であるものほどより適切である、と云う事になります。
ここで、暗黙の型変換は「『より汎用的』な型への変換」なので、「暗黙的な型変換の『変換元』」が「より適切」であると言えます。
その結果、 long より int 、 int より short 、 short より byte が選択される、と云う事になる、と。
# ……まとめてはみたものの、後半があやしい気がする。。。><