インスタンスに対する型は一意
@ITのインスタンスに対する変数型は、本当に、一意に決まるのか?の投稿
この場合、これは、
object s = new StringBuilder();
と書く可能性は無いと言っているのでしょうか?
とか、「ポリモーフィズム」があるからこそ、一意に StringBuilder に決まるのですね。
interface I {} class A {} class B : A, I {}
のような継承/実装関係に対して
B b = new B(); A a = new B(); // …(i) I c = new B(); // …(ii)
ということが許されるから、new B() の変数型を B とすることで、インスタンスのサポートするすべての変換可能型に対する操作が問題なく実施できるという恩恵が得られるのです。
逆にいえば、
object s = new StringBuilder();
のように書く可能性が *ある* からこそ、暗黙の型は StringBuilder でなければならないんですね。object は全ての型が入っちゃうので、途中に出した例でいうと、(i) A a = new B() と書く可能性があるからこそ「new B()」に対する暗黙の型は B である必要があるんですね。もし、暗黙の型が A であったら (i) は成り立ちますが、(ii) I c = new B(); は A が I を実装していないため、コンパイルエラーになってしまうことになります。
暗黙の型の決定は、ポリモフィズムを最大限に活かしているのです。*1
*1:.NET ではインターフェスの明示的実装に関して、オブジェクトの特性としての外装と操作としての外装の差異として呼び出せないメソッドができちゃいますけどね