我尝试创建一个继承 System.ICloneable 接口(interface)但 Clone() 方法的返回类型为 T 的通用接口(interface)。当然,T 类型需要约束以确保它是 System.Object 的继承-class 但以下代码不起作用。
public interface ICloneable<T> : System.ICloneable where T : object {
T Clone ();
}
我做错了什么?
以下约束也不起作用:
- 其中 T : System.Object
- 其中 T : 类
在这种情况下,我如何使用 Liskov 原则来解决这个问题?
P.S.:对不起我的英语,如果我犯了错误。我的母语不是英语。
最佳答案
为什么你需要约束?一切都继承自 object
...
没有约束,你的代码应该可以工作,但你需要同时实现 Clone
方法与 IEnumerable
相同/IEnumerable<T>
work - .NET 没有协变返回类型。然后您还应该指定您的 Clone
方法是隐藏 ICloneable
中的那个:
public interface ICloneable<T> : ICloneable
{
new T Clone();
}
请注意当前 ICloneable
接口(interface)有点被弃用了——因为它没有给出克隆深度的指示,所以在大多数情况下它不是很有用。
你真的需要扩展非泛型类型吗?您希望用户既希望使用非通用界面,也希望使用您的通用界面吗?
关于c# - C#.NET 中 liskov 原则的类型参数约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1131011/