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

问题描述

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

我当前的代码如下所示:

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; }
}

标签: c#.net

解决方案


不,语言中没有办法静态地将其捕获为使用错误。

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

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


推荐阅读