Да, они не являются виртуальными с языковой точки зрения. Но они на самом деле, насколько CLR обеспокоен. Этот пример кода:
class Example : IDisposable {
public void Dispose() {}
}
Создает этот IL для метода Dispose ():
.method public hidebysig newslot virtual final // <=== here
instance void Dispose() cil managed
{
// Unimportant
} // end of method Example::Dispose
Обратите внимание на атрибуты метода: virtual и final . Последнее гарантирует, что вы не сможете переопределить метод в производном классе. Заставить реализацию метода интерфейса вести себя как не виртуальный метод в языке, а виртуальный во время выполнения.
Это также отвечает на ваш вопрос о раннем / позднем связывании. Это рано, слот v-таблицы заполняется, когда класс загружается.