Вы не можете ограничить метод только принятием параметров определенного типа во время компиляции , если только этот тип не равен sealed
. Фактически, это нарушило бы любой объектно-ориентированный принцип, поскольку экземпляр производного типа всегда является экземпляром базового класса. С другой стороны, ваш Foo
-метод вообще не должен заботиться об этом, поскольку он ничего не знает о производном типе. Все, что он получает, это аргумент типа Base
, который может быть или не быть производного типа.
Во время выполнения вы, конечно, можете получить фактический тип и выдать исключение для случая Derived
:
public void Foo(Base @base)
{
if(@base.GetType() != typeof(Base))
throw new NotSupportedException("must be of type Base");
}
В качестве отступления: base
является зарезервированным ключевым словом и не может использоваться в качестве имени для переменной. Таким образом, я добавил дословно (@
) в код.