C # में T where T: class ’का क्या अर्थ है?


135

C # में क्या where T : classमतलब है?

अर्थात।

public IList<T> DoThis<T>() where T : class

जवाबों:


115

सीधे शब्दों में कहें तो यह जेनेरिक पैरामीटर को एक वर्ग (या अधिक विशेष रूप से एक संदर्भ प्रकार जो एक वर्ग, इंटरफ़ेस, प्रतिनिधि या सरणी प्रकार हो सकता है) के लिए बाध्य कर रहा है।

अधिक विवरण के लिए इस MSDN लेख को देखें।


4
आप एक मामले में चूक गए। T का प्रकार तर्क भी किसी अन्य प्रकार का पैरामीटर हो सकता है जो एक संदर्भ प्रकार होने के लिए विवश है
एरिक लिपर्ट


35

यह एक प्रकार की बाधा है T, यह निर्दिष्ट करता है कि यह एक वर्ग होना चाहिए।

whereखंड अन्य प्रकार की कमी, जैसे निर्दिष्ट करने के लिए इस्तेमाल किया जा सकता:

where T : struct // T must be a struct
where T : new()  // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface

अधिक जानकारी के लिए, whereखंड , या सामान्य पैरामीटर की कमी पर MSDN के पृष्ठ देखें ।


5
इन्हें एक साथ जोड़ना संभव है, जैसे:where T : class, IComparable, new()
इज़्ज़ी

17

यह संदर्भ प्रकारों केT लिए प्रतिबंधित है । आप वहाँ मूल्य प्रकार ( और आदिम प्रकार को छोड़कर ) नहीं रख पाएंगे ।structstring


यह उत्तर (और एक ही जानकारी के साथ एक दूसरे को) मेरे लिए चयनित एक से अधिक उपयोगी था, क्योंकि यह एक उदाहरण देता है कि टी क्या नहीं हो सकता है (मैं सोच रहा था कि इस बाधा ने वास्तव में कहानी में क्या जोड़ा)
mins

9

इसका मतलब यह है कि Tजेनेरिक विधि का उपयोग करते समय उपयोग किया जाने वाला प्रकार एक वर्ग होना चाहिए - अर्थात यह एक संरचना नहीं हो सकती है या जैसी संख्या में निर्मित हो सकती है intयाdouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();

8

where T: class शाब्दिक अर्थ है कि T has to be a class। यह किसी भी प्रकार का संदर्भ हो सकता है। अब जब भी कोई कोड आपकी DoThis<T>()विधि को कॉल करता है तो उसे T को बदलने के लिए एक वर्ग प्रदान करना होगा । उदाहरण के लिए अगर मुझे आपकी DoThis<T>()विधि को कॉल करना था तो मुझे इसे निम्न तरह से कॉल करना होगा:

DoThis<MyClass>();

यदि आपका मैथोड निम्नलिखित की तरह है:

public IList<T> DoThis<T>() where T : class
{
   T variablename = new T();

   // other uses of T as a type

}

फिर जहां कभी T आपकी विधि में दिखाई देता है, उसे MyClass द्वारा प्रतिस्थापित किया जाएगा। तो अंतिम विधि जिसे कंपाइलर कॉल करता है, वह निम्न की तरह दिखेगा:

public IList<MyClass> DoThis<MyClass>() 
{
   MyClass variablename= new MyClass();

  //other uses of MyClass as a type

  // all occurences of T will similarly be replace by MyClass
 }

4
-1: के new T()साथ संभव नहीं है where T : class। आपको इसे करने where T: new()की अनुमति देने के लिए निर्दिष्ट करना होगा।
निबंधकार

@explorer हम किसी एकल जेनेरिक विधि को परिभाषित कर सकते हैं और इसे विभिन्न स्थानों से अलग-अलग पैरामीटर्स पास करके रिकॉर्ड डालने के लिए कई स्थानों से कॉल कर सकते हैं।
ज़ेकर

4

इसे एक प्रकार का पैरामीटर बाधा कहा जाता है। प्रभावी रूप से यह विवश करता है कि टी किस प्रकार का हो सकता है।

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

टाइप पैरामीटर्स पर अड़चनें (C # प्रोग्रामिंग गाइड)


4

T एक वस्तु प्रकार का प्रतिनिधित्व करता है, इसका अर्थ है कि आप किसी भी प्रकार का दे सकते हैं। IList: यदि IList s = नया IList; अब s.add ("हमेशा स्ट्रिंग को स्वीकार करें।")।



1

'T' एक सामान्य प्रकार का प्रतिनिधित्व करता है। इसका अर्थ है कि यह किसी भी प्रकार के वर्ग को स्वीकार कर सकता है। निम्नलिखित लेख मदद कर सकता है:

http://www.15seconds.com/issue/031024.htm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.