2012-11-20 8 views
7

可能性の重複:
Impossible recursive generic class definition?奇妙なC#ジェネリックcontraint

私はちょうど

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

} 

が合法であることを発見しました。それはどういう意味ですか? 再帰的で、何かをインスタンス化することが可能です このようにしますか?

+10

これらは「奇妙に繰り返される」総称制約と呼ばれます。次の記事も参照してください:[Curiouser and curiouser](http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx)、Eric Lippert著、それはおそらく最良の説明です得られる。 – Kobi

+0

これは、実際のクラスへの型参照を取得するためによく使用されます。例はIComparableなどです。 – leppie

+1

@AlvinWong、それはまったく役に立たないわけではありません。あなたの値を保持するFooにプロパティを追加することで、このような木のような構造を構築することができます。同様に、Fooは継承できます。したがって、この制約によってFooの派生も許可されます。 – series0ne

答えて

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

この制約を使用することができ、どのようにこのことから、単なる一例にそれを取るしてください制約を使用することができる

+0

興味深い例。確かに私はそれが好きです - それはまだ間違って感じますが、私はそれが*いくつかの用途を持つことができることがわかります... – Grhm