奇怪的C#泛型约束

时间:2012-11-20 09:05:25

标签: c# generics recursion

  

可能重复:
  Impossible recursive generic class definition?

我刚发现

public class Foo<T> where T : Foo<T>
{

}

是合法的。究竟是什么意思?它似乎 递归,是否可以实例化一些东西 像这样?

1 个答案:

答案 0 :(得分:2)

我不会说这没用。让我们观察下面的示例如何支持流利语法。在某些情况下,您要在中创建一些base实现,并希望提供流畅的声明...您可以这样使用此约束

public class Parent<TChild>
    where TChild : Parent<TChild>
{
    public string Code { get; protected set; }

    public TChild SetCode(string code)
    {
        Code = code;
        return this as TChild; // here we go, we profit from a constraint
    }
}

public class Child : Parent<Child>
{
    public string Name { get; protected set; }

    public Child SetName(string name)
    {
        Name = name;
        return this // is Child;
    }
}

[TestClass]
public class TestFluent
{
    [TestMethod]
    public void SetProperties()
    {
        var child = new Child();
        child
            .SetCode("myCode") // now still Child is returned
            .SetName("myName");

        Assert.IsTrue(child.Code.Equals("myCode"));
        Assert.IsTrue(child.Name.Equals("myName"));
    }
}

请举一个例子,说明如何使用这种约束