是否可以将传递给.NET方法的变量类型限制为不是派生类?

Esp*_*spo 1 .net c#

我可以通过在编译而不是运行时捕获此类错误的方式约束传递给我的方法的类型吗?

我当前的代码如下所示:

void Main()
{
    var dog = new Dog();
    SaveAnimal(dog);
}

void SaveAnimal(Animal animal) {
    var isAnimal = animal.GetType().UnderlyingSystemType == typeof(Animal);
    Debug.Assert(isAnimal, "You can not save dogs!");
}

class Animal {
    public int Legs { get; set; }
}

class Dog : Animal {
    public int TailLength { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 6

不,语言中没有办法静态地将其视为使用错误.

您可以在运行时断言,因为您已经这样做了.然而,这违背了继承的精神,因为一个基本假设是派生类型必须替代基类型(Liskov替换原则).

也许你可以通过提供Animal一种新方法让动物自救abstract void Save().然后,每只动物决定做什么.Dog然后可以扔一个NotSupportedException.