c# - 是否可以将传递给 .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; }
}
解决方案
不,语言中没有办法静态地将其捕获为使用错误。
您可以在运行时断言这一点,因为您已经这样做了。但是,这违背了继承的精神,因为一个基本假设是派生类型必须替换基类型(Liskov 替换原则)。
Animal
也许你可以通过提供一种新方法让动物自救abstract void Save()
。然后,每只动物决定做什么。Dog
然后可以抛出一个NotSupportedException
。
推荐阅读
- python-3.x - 单击按钮时使用 .kv 语言更改屏幕
- numpy - 我的 cython 实现数学形态学侵蚀操作有什么问题
- swift - 仅当 iOS 13 可用时如何导入特定框架?
- python-3.x - 为什么我的按钮在实际单击 tkinter 中的按钮之前调用了一个函数?
- c# - 从数据库自动刷新 WinForms DataGridView
- vb.net - 我如何解决 ExecuteNonQuery 抛出异常“?”附近的语法不正确
- python - scipy.optimize.linprog 等式约束不满足
- c++ - 使用flag=check函数检查某酒店房间流程项目的房间状态
- swift - 斯威夫特:UIButton虽然连接不工作,但其他按钮工作
- javascript - JavaScript sort() 方法的更简单方法