// せっかく鎮火したところにまた油を注ぐようでアレですけども…
型推論を3つ挙げてみる。
- C# の var
- C# のジェネリックメソッドの型パラメータ
- C++ の関数テンプレートの型パラメータ
C# の var は、「型名を書かなくていい」ということだけだと思うのですね。
その変数を使うときは、その型が何なのかは意識しておかなければならないわけですし。
数値型であっても、数値型であるという認識は必要です。
C# のジェネリックメソッドの型パラメータは、where による制約がある場合とない場合を分けて考えます。
まず、ない場合。これは、関数の呼び出し側、呼び出され側ともに、本当に型をまったく意識しなくていいわけです。この点は var と異なります。
で、ある場合。この時は、推論が働きません。いや、コンパイラが実際にどう振舞うかは知りませんが、呼び出し側も呼び出され側も、制約に型が明記されていますので、その型のオブジェクトとして扱えばよいのです。
C++ の関数テンプレートの型パラメータも、C# 同様に、まったく意識しなくていい場面もあります。
が、C++ で特徴的な部分を捉えるならば、明文化はされていないものの制約はある、という点でしょう。
しかし、コンパイラと同じ推論を人間もしなくてよいという点においては、本質的に C# のジェネリックと同じです。
ジェネリックとテンプレートは、型を推論するのはコンパイラだけです。
関数の呼び出され側は、型パラメータが実際にどの型に解決されるかを意識する必要がありません。
var は、プログラマが中身の型を意識する必要があります。
この比較をもって、どっちが優れているとか劣っているとか、var がいいとか悪いとかは言いません。もう語りつくされたでしょうし。
ただ、一口に「型推論」と言っても、性質は違うもんだなぁ、と。それだけです。