在C#.NET中输入liskov原则的参数约束

Wil*_*sem 1 c# generics liskov-substitution-principle constraints

我尝试创建一个继承System.ICloneable接口的通用接口,但Clone()方法的返回类型为T.当然,T类型需要约束以确保它是System.Object类的继承但是以下代码无效.

public interface ICloneable<T> : System.ICloneable where T : object {

   T Clone ();

}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

此外,以下约束不起作用:

  1. 其中T:System.Object
  2. 哪里T:上课

在这种情况下,我如何使用Liskov原则,说明您可以缩小返回类型,以解决此问题?

PS:对不起我的英语,如果我犯了错误.我不是母语为英语的人.

Jon*_*eet 5

为什么你需要一个约束?一切都继承自object......

如果没有约束,您的代码应该可以工作,但是您需要以CloneIEnumerable/ IEnumerable<T>work 相同的方式实现这两种方法- .NET没有协变返回类型.您还应该指定您的Clone方法将其隐藏在ICloneable:

public interface ICloneable<T> : ICloneable
{
    new T Clone();
}
Run Code Online (Sandbox Code Playgroud)

请注意,当前的ICloneable界面有点不赞成 - 因为它没有给出克隆深度的指示,在大多数情况下它并不是非常有用.

你真的需要扩展非泛型类型吗?您是否希望用户想要使用非通用接口以及通用接口?