С++ не поддерживает методы виртуальных шаблонов. Причина в том, что это изменило бы значение vtable
всякий раз, когда создается новый экземпляр такого метода (его нужно добавить в vtable
).
Java в отличие от этого позволяет виртуальные общие методы. Здесь также ясно, как это можно реализовать: генерируемые Java файлы стираются во время выполнения, поэтому общий метод является обычным методом во время выполнения, поэтому никаких изменений в vtable
не требуется.
Но теперь к С#. С# действительно обновил дженерики. При использовании редизайтных дженериков и особенно при использовании типов значений в качестве параметров типа должны быть разные версии общего метода. Но тогда у нас та же проблема, что и у С++: нам нужно было бы изменить vtable всякий раз, когда создавалось новое создание универсального метода.
Я не слишком глубоко во внутреннюю работу С#, поэтому моя интуиция может быть просто совершенно неправильной. Так может ли кто-нибудь с более глубокими знаниями о С#/.NET сказать мне, как они могут реализовать общие виртуальные методы в С#?
Здесь код, чтобы показать, что я имею в виду:
[MethodImpl(MethodImplOptions.NoInlining)]
static void Test_GenericVCall()
{
var b = GetA();
b.M<string>();
b.M<int>();
}
[MethodImpl(MethodImplOptions.NoInlining)]
static A GetA()
{
return new B();
}
class A
{
public virtual void M<T>()
{
}
}
class B : A
{
public override void M<T>()
{
base.M<T>();
Console.WriteLine(typeof(T).Name);
}
}
Как CLR отправляет правильный код JIT при вызове M
в функции Test_GenericVCall
?