c# - 如何创建泛型类的实例,其中类型约束到相同的泛型类
问题描述
假设一个类定义如下,
public class MyGeneric<T> where T : MyGeneric<T>
{
}
我们可以创建这个类的对象吗?如果不是,为什么会存在这种情况?我问这个是出于我的好奇心,并且对 C# 没有深入的了解。
解决方案
当您有一个类层次结构时,它很有用,并且您希望能够在基类中编写返回派生类实例的方法(例如this
):
public abstract class Base<T> where T : Base<T>
{
public T WithFoo(int foo)
{
// ...
return (T)this;
}
}
public class Derived : Base<Derived>
{
// ...
}
Derived d = new Derived().WithFoo(3);
当然,这并不能阻止某人写作:
public class Other : Base<Derived> { }
...解决这个问题的唯一方法是运行时检查,这可能很难看:
public Base()
{
Trace.Assert(typeof(T) == this.GetType());
}
其他一些语言有特定的关键字来涵盖这种情况。