2012-11-20 11 views
7

संभव डुप्लिकेट:
Impossible recursive generic class definition?अजीब सी # सामान्य contraint

मैं सिर्फ पता चला कि

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

} 

कानूनी है। इसका सही अर्थ में तात्पर्य क्या है? ऐसा लगता है कि रिकर्सिव है और क्या इस तरह को तुरंत चालू करना संभव है?

+10

इन्हें "उत्सुकता से आवर्ती" सामान्य बाधाओं के रूप में जाना जाता है। यह भी देखें: [Curiouser और curiouser] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx), एरिक लिपर्ट द्वारा, यह शायद सबसे अच्छा स्पष्टीकरण है आप प्राप्त कर सकते हैं। – Kobi

+0

यह आमतौर पर वास्तविक वर्ग के प्रकार का संदर्भ प्राप्त करने के लिए उपयोग किया जाता है। उदाहरण IComparable है, आदि – leppie

+1

@AlvinWong, यह पूरी तरह से बेकार नहीं है। आप अपने मूल्यों को रखने वाले फू में गुण जोड़कर, इस तरह पेड़ की तरह संरचनाएं बना सकते हैं। समान रूप से, फू को विरासत में प्राप्त किया जा सकता है, और इसलिए यह बाधा फू के व्युत्पन्न को भी अनुमति देगी। – 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

संबंधित मुद्दे