我对这个接口和类定义感到有点困惑。有人可能会发光吗?
接口和从中继承的类以这种方式定义:
public abstract class DNum {
}
public abstract class DNum<DIM> : DNum where DIM : DNum<DIM> { //etc...
...... DIM : DNum<DIM>
位投掷了我。 DIM必须从我们当前定义的类继承,它本身作为泛型参数?这是某种无限递归的定义吗?这是怎么回事?
答案 0 :(得分:7)
这种声明的通常 intent 是对于任何具体的子类,DIM
将是该子类:
public sealed class Concrete : DNum<Concrete>
{
...
}
通常情况下,您可以创建相同类型的新实例,或者非常相似的新实例。
(请注意,.NET命名约定会在DIM
上作为类型参数名称。(
答案 1 :(得分:1)
Polity与Eric Lippert博客的链接非常有用,可以解决这些奇怪声明的作者的意图。
请注意(只要意图是E.Lippert提出的意图),有一种表达相同类型约束的替代方法,它更加安全,可读和易懂。 它依赖于表达方法。
因为您的代码示例不足以确定意图,所以我们假设我们已经阅读了Eric Lippert的文章,其目的是允许任何类型的动物只能与同一品种的另一种动物交朋友。 / p>
然后你可以这样做:
abstract class Animal
{
...
}
public static class AnimalExtensions
{
public static void MakeFriends(this T animal, T anotherT) where T : Animal
{
...
}
}
了解这种技术非常有用(而且根本不会混淆)。