好奇心から、コンパイラが制約のないジェネリック型をtypeof(object)とは異なる方法で処理するのはなぜですか?
class Bar { }
class Foo
{
void foo(object thing)
{
((Bar)thing).ToString();
}
}
class Foo<T>
{
void foo(T thing)
{
((Bar)thing).ToString();
}
}
上記では、「Tthing」をBarにキャストすると、コンパイラエラーが発生します。ただし、「オブジェクトのもの」をBarにキャストすることは、もちろんコンパイラーが私にできることです。
見えないのはその理由です。結局のところ、.netオブジェクトはキャッチオールであり、実行時型はボックス化された値または任意の型のオブジェクトである可能性があります。したがって、コンパイラが2つのケースを区別する論理的な理由がわかりません。私ができる最善のことは、「プログラマーは、コンパイラーがジェネリック型で型チェックを行うことを期待しますが、オブジェクトでは行わないことを期待する」のようなものです。:)それですべてですか?
ところで、私は、Fooの場合でも、書くだけでキャストを完了できることを認識しています。
((Bar)(object)thing).ToString();
コンパイラがこれを行う理由を理解したいだけです...