奇怪的C#泛型约束

7
我发现这样的代码存在问题:

可能是重复问题:
Impossible recursive generic class definition?

我刚刚发现...

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

}

is legal. 这是什么意思?它似乎是递归的,是否可能实例化这样的东西?


10
这些被称为“奇妙地重复”的通用约束。参见:Eric Lippert的《越来越好奇》(Curiouser and curiouser),这可能是你可以得到的最好的解释。 - Kobi
这通常用于获取实际类的类型引用。例如,IComparable等。 - leppie
1
@AlvinWong,这并不是完全无用的。您可以通过向Foo添加保存值的属性来构建类似树形结构的数据结构。同样,Foo也可以被继承,因此该约束也将允许任何派生自Foo的类。 - Matthew Layton
1个回答

2

我不会说这是无用的。让我们观察下面的例子,如何支持“流畅”的语法。在某些情况下,您正在创建父级中的一些基本实现,并希望提供流畅的声明...您可以使用以下约束方式:

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"));
    }
}

请注意,这只是一个例子,展示了如何使用此约束。

有趣的例子。我不确定我喜欢它——它仍然感觉不对,但我看到它可能有一些用途... - Grhm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接