【问题标题】:Strange C# generic contraint [duplicate]奇怪的 C# 泛型约束 [重复]
【发布时间】:2012-11-08 07:33:15
【问题描述】:

可能重复:
Impossible recursive generic class definition?

我才发现

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

}

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

【问题讨论】:

  • 这些被称为“奇怪地重复出现”的通用约束。另请参阅:Curiouser and curiouser,作者 Eric Lippert,这可能是您能得到的最佳解释。
  • 这通常用于获取对实际类的类型引用。示例是 IComparable 等。
  • @AlvinWong,这并非完全没用。您可以通过向 Foo 添加包含您的值的属性来构建像这样的树状结构。同样,Foo 可以被继承,因此这个约束也允许 Foo 的任何派生。

标签: c# generics recursion


【解决方案1】:

我不会说这是没用的。让我们观察下面的示例如何支持 fluent 语法。如果您在 Parent 中创建一些 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"));
    }
}

请举个例子,说明如何使用此约束

【讨论】:

  • 有趣的例子。不确定我是否喜欢它 - 它仍然感觉不对,但我看到它可能有一些用途......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多