Если не задействован «динамический» тип, разрешение перегрузки и определение типа выполняются во время компиляции , а не во время выполнения .
Когда разрешение перегрузки видит Test.GenericFunc(this);
, оно должно вывести аргумент универсального типа, соответствующий отсутствующему параметру универсального типа. Это простая проблема; он использует время компиляции типа this
, а внутри метода BaseType
, явно время компиляции типа this
всегда BaseType
.
Следовательно, разрешение перегрузки предполагает, что вы намеревались вызвать Test.GenericFunc<BaseType>(this)
.
Если вы хотите, чтобы это работало во время выполнения, вы можете сделать это в C # 4. Просто скажите Test.GenericFunc((dynamic)this)
. Это снова запустит механизм разрешения перегрузки во время выполнения, после чего будет притворяться, что вы произвели приведение this
к его типу выполнения обратно во время компиляции.
Да, это так же дорого, как кажется. Если вам нужен семантический анализ во время выполнения, нам нужно запустить семантический анализатор во время выполнения.