Код: Выделить всё
abstract class A
{
public virtual void M() { }
}
sealed class B : A
{ }
internal class C
{
private readonly A _a = new B();
public void Trigger()
{
// This performs a virtual call because
// _a is defined as an abstract class.
_a.M();
}
}
< /code>
и исправленный код: < /p>
abstract class A
{
public virtual void M() { }
}
sealed class B : A
{ }
internal class C
{
private readonly B _b = new B();
public void Trigger()
{
_b.M();
}
}
< /code>
Но в обоих случаях Callsite в IL выглядит как (.net 8) < /p>
IL_0006: callvirt instance void A::M() /* 06000011 */
Код: Выделить всё
callсвязано с тем, что цель метода не может быть переопределена. (Даже если есть b.m () , компилятор генерирует Callvirt )
Подробнее здесь: https://stackoverflow.com/questions/796 ... r-improved
Мобильная версия