変数は、あるタイプまたは別のタイプのみにすることができます。そうでない場合、コンパイラーは、後で許可するメンバーアクセスをどのように知るのでしょうか。
を宣言する一般的なベースタイプ(ベースクラスまたはインターフェイス)があるfunction
場合、それは変数のタイプである必要があります。
BaseType obj;
if (a == b)
{
obj = new Type1();
}
else
{
obj = new Type2();
}
obj.Function(); // Name fixed to follow conventions
これは次のように簡単になります。
BaseType obj = a == b ? (BaseType) new Type1() : new Type2();
obj.Function();
それらが本当に異なるタイプであるため、完全に別個のメソッドを効果的に呼び出す場合は、各ブロック内で変数を宣言してそこでメソッドを呼び出す必要があります。または、C#4以降を使用している場合は、動的型付け:
dynamic obj = a == b ? (dynamic) new Type1() : new Type2();
obj.Function();
これが本当に一般的な関数であるかどうか(この場合は基本型で宣言する必要があるかどうか)、または同じ名前の2つの関数があるのは偶然の一致であるかどうか(この場合)を実際に検討する必要があります。それらを同じように扱うことを試みることは悪い考えです。(たとえば、1つのタイプをリファクタリングしてメソッド名を変更するとします...)