2012-11-20 22 views
7

Olası Çoğalt:
Impossible recursive generic class definition?Garip C# jenerik contraint

Sadece

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

} 

yasal olduğunu keşfetti. Tam olarak ne anlama geliyor? özyinelemeli gibi görünüyor ve böyle bir şey başlatmak mümkün mü?

+10

Bunlar "merakla yinelenen" genel kısıtlamalar olarak adlandırılır. Ayrıca bakınız: [Curiouser ve meraklı] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx), Eric Lippert, muhtemelen en iyi açıklamadır alabilirsiniz. – Kobi

+0

Bu, gerçek sınıfa bir tür referans almak için yaygın olarak kullanılır. Örneğin IComparable, vb. – leppie

+1

@AlvinWong, tamamen işe yaramaz değil. Değerlerinizi saklayan Foo'ya özellikler ekleyerek bu şekilde ağaç benzeri yapılar oluşturabilirsiniz. Aynı şekilde, Foo kalıtsal olabilir ve bu nedenle bu kısıtlama Foo'nun herhangi bir türevine de izin verecektir. – series0ne

cevap

2

Bunun yararsız olduğunu söyleyemem. Aşağıdaki örneğe, akıcı sözdizimini nasıl destekleyeceğimizi gözlemleyelim. durumlarda, bir Ana bazı base uygulanmasını oluşturuyor ve akıcı bildirimleri sağlamak istiyorum ki ... nasıl Bu nedenle, sadece bir örnektir götürün, bu kısıtlamayı bu şekilde

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

Lütfen kullanabilirsiniz kısıtlama kullanılabilir

+0

İlginç bir örnek. Ondan hoşlandığımdan emin değilim - hala yanlış geliyor, ama görüyorum ki * bazı kullanımları olabilir * – Grhm