Visual C# の IntelliSense の 2 つの性質,みたいな話

しばしば比較される Visual C# と Visual C++ の IntelliSense ですが,こういう視点で見てみるとどうでしょう?
簡単のためにインスタンスメソッド (拡張メソッドも含む) の補完に話を絞ります.

  1. Visual C# では,補完候補に出てくるインスタンスメソッドを使えば (その選択に関して) コンパイルエラーは起きない
    • Visual C++ では,呼び出せないはずのメソッド (例えば private メソッド) が候補に表示されることがある
  2. Visual C# では,コンパイルエラーが起きない全てのインスタンスメソッドは補完候補に表示される*1
    • Visual C++ でのメソッド補完は不安定で,何かトラブルが起きると補完候補が全く表示されなくなる

参考

インスパイア元は以下.

型推論とかのプログラム解析の技術を評価する場合,二つの性質が重要になる.「健全性」と「完全性」.「型推論が健全性を持っている」というのは,「型が推論できたら,そのプログラムは正しい」ということ.「型推論が完全性を持っている」というのは,「正しいプログラムは必ず型が推論できる」ということ.MLなんかの型推論は,完全かつ健全である.非常に良くできた型推論アルゴリズムと言える.ただし,型推論アルゴリズムというのは,型システムに基づいて考えるべきものなので,型システムがクソだった場合はいくら完全かつ健全な型推論アルゴリズムだったとしても使いものになるかはわからない.一般的に,完全性と健全性を考えると,完全性は保つのが困難で健全性は保つのが比較的容易である.

実は,この二つの性質も,それだけではあんまり意味はない.良く見ると,「どういう入力に対してもfalseを返す型推論アルゴリズム」は健全であるし,「どういう入力に対してもtrueを返す型推論アルゴリズム」は完全になる.どういう型システムに対して型推論アルゴリズムが定義されているのか,というのが非常に重要になる.

あと完全性と健全性を両立できない場合は,健全性だけでも成り立たせるのが常套手段.「たまにfalse positiveが出るけどtrueって返ってきたらOK」なシステムと,「たまにfalse negativeが出るので,trueって返ってきても大丈夫かよくわからない」システムだと,当然前者の方が使い勝手が良い.

*1:明らかな例外が [http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.editorbrowsableattribute.aspx:title=EditorBrowsable 属性] が付けられたメンバです.これらのメンバは意図的に IntelliSense のリストに表示させなくなっています