C#泛型:“X <t>哪里有T:X <t>”泛型类型约束是什么意思?

时间:2016-02-13 22:11:43

标签: c# generics

读一本书:NHibernate 3: Beginners guide我发现了一个令我好奇的片段:

  

行动时间 - 创建基础实体

     

(...)

     
      
  1. 将新类添加到项目的文件夹域中,并将其命名为Entity。在T中使类成为抽象和通用的。您的代码应类似于以下代码片段:
  2.   
 using System;

 namespace OrderingSystem.Domain
 {
     public abstract class Entity<T> where T : Entity<T>
     { }
 }

我的问题是:片段where T : Entity<T>是什么意思?

我理解类型where上的T部分can be applied to add constraints,但上面的代码似乎永远无法实例化此类(如果它不是抽象的话) )。

1 个答案:

答案 0 :(得分:30)

这很可能是为返回(或接收)更多派生类型的实例的方法提供额外的类型安全性,从而使调用者不必将结果强制转换为派生类型。

abstract class Cloneable<T> where T : Cloneable<T>
{
    public abstract T Clone();
}

sealed class MyCloneable : Cloneable<MyCloneable>
{
    public override MyCloneable Clone()
    {
        return new MyCloneable();
    }
}

MyCloneable instance = new MyCloneable();
MyCloneable clone = instance.Clone();

修改

根据@ siride的评论,这被称为奇怪的重复模板模式。 Eric Lippert在C#中写了一篇很棒的文章:

https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/

P.S。并且只是为了说明如果你要取消通用约束,上面的例子会是什么样子:

abstract class Cloneable
{
    public abstract Cloneable Clone();
}

sealed class MyCloneable : Cloneable
{
    public override Cloneable Clone()
    {
        return new MyCloneable();
    }
}

MyCloneable instance = new MyCloneable();
MyCloneable clone = (MyCloneable)instance.Clone(); // Note the cast.