2009-03-07 13 views
11

where T : somevalue का अर्थ क्या है? मैंने बस कुछ कोड देखा जो where T : Attribute कहा। मुझे लगता है कि इसमें जेनेरिक के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि इसका क्या अर्थ है या यह क्या कर रहा है।"जहां टी: कुछवल" का अर्थ है?

क्या किसी को पता है?

उत्तर

28

यह एक constraint on a type parameter है, जिसका अर्थ है कि प्रकार T एक सामान्य वर्ग या विधि के लिए किसी वर्ग Attribute

से विरासत चाहिए उदाहरण के लिए:

public class Foo<T> : 
    where T : Attribute 
{ 
    public string GetTypeId(T attr) { return attr.TypeId.ToString(); } 
// .. 
} 

Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute 
Foo<int> baz; // Compiler error, int does not inherit Attribute 

यह उपयोगी है, क्योंकि यह सामान्य अनुमति देता है T की वस्तुओं के साथ चीजों को करने के लिए कक्षा T पर कुछ भी Attribute होना चाहिए।

उपरोक्त उदाहरण में, यह GetTypeIdattr की TypeId क्वेरी करने के लिए के लिए क्योंकि TypeId एक Attribute की संपत्ति है ठीक है, और क्योंकि attr एक T है यह एक प्रकार है कि Attribute से विरासत होना चाहिए।

प्रतिबन्ध भी एक ही प्रभाव के साथ, सामान्य तरीकों पर इस्तेमाल किया जा सकता:

public static void GetTypeId<T>(T attr) where T : Attribute 
{ 
    return attr.TypeId.ToString(); 
} 

अन्य बाधाओं आप एक प्रकार पर जगह कर सकते हैं कर रहे हैं; MSDN से:

where T: struct

प्रकार तर्क एक मूल्य प्रकार होना चाहिए। Nullable को छोड़कर कोई भी मान प्रकार निर्दिष्ट किया जा सकता है।

where T : class

प्रकार तर्क एक संदर्भ प्रकार होना चाहिए; यह किसी भी वर्ग, इंटरफ़ेस, प्रतिनिधि, या सरणी प्रकार पर भी लागू होता है।

where T : new()

प्रकार तर्क एक सार्वजनिक parameterless निर्माता होना आवश्यक है। का उपयोग अन्य बाधाओं के साथ, नई() बाधा को निर्दिष्ट किया जाना चाहिए।

where T : <base class name>

प्रकार तर्क है या निर्दिष्ट आधार वर्ग से प्राप्त करना होगा।

where T : <interface name>

प्रकार तर्क है या निर्दिष्ट इंटरफ़ेस को लागू करना होगा। एकाधिक इंटरफ़ेस बाधा निर्दिष्ट हो सकती है। बाध्यकारी इंटरफ़ेस सामान्य भी हो सकता है।

where T : U

प्रकार तर्क टी के लिए आपूर्ति चाहिए है या तर्क यू इस के लिए आपूर्ति से निकाले जाते हैं एक नग्न प्रकार बाधा कहा जाता है।

+0

+1 यह काफी समेकित होना चाहिए। काश मैं एक जवाब पसंदीदा कर सकते हैं। – Sung

1

where खंड का प्रयोग जेनिक्स का उपयोग करते समय पारित किए गए तर्कों को सीमित करने के लिए किया जाता है। जब आप एक सामान्य वर्ग बनाते हैं तो यह आपके वर्ग में टी का उपयोग करने की योजना के आधार पर तर्क प्रकार निर्दिष्ट करने के लिए आपकी सबसे अच्छी रुचि हो सकती है। यदि यह सिस्टम के अलावा कुछ भी है। ऑब्जेक्ट कर सकता है तो constraint का उपयोग करना शायद सबसे अच्छा है क्योंकि आपको एक रनटाइम बनाम संकलन समय त्रुटि मिल जाएगी।

उदाहरण

आप एक वर्ग

class Person<T> where T : System.IComparable<T> 
{ 
    //can now use CompareTo 
} 

बनाते हैं आप इस वर्ग के कुछ भी है कि IComparable को लागू नहीं करता है पारित नहीं नहीं कर सकते। तो अब व्यक्ति वर्ग में पारित की गई किसी भी चीज पर तुलनाटो का उपयोग करना सुरक्षित है।

1

यह सामान्य तर्क के रूप में उपयोग किए जाने वाले प्रकार को प्रतिबंधित करने का एक तरीका है। तो:

where T : SomeType 

मतलब यह है कि टी या तो SomeType से निकाले जाते हैं या इंटरफ़ेस SomeType

5

साथ ही क्या अन्य लोगों ने कहा, आप भी निम्न होना को लागू करना चाहिए:

  • नई () - टी में डिफॉल्ट कन्स्ट्रक्टर
  • क्लास - टी एक संदर्भ प्रकार होना चाहिए
  • संरचना - टी एक मान प्रकार
संबंधित मुद्दे