यह एक 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
होना चाहिए।
उपरोक्त उदाहरण में, यह GetTypeId
attr
की 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
प्रकार तर्क टी के लिए आपूर्ति चाहिए है या तर्क यू इस के लिए आपूर्ति से निकाले जाते हैं एक नग्न प्रकार बाधा कहा जाता है।
+1 यह काफी समेकित होना चाहिए। काश मैं एक जवाब पसंदीदा कर सकते हैं। – Sung