2012-05-17 8 views
14

नहीं किया जा सकता जब मैं के साथ टी विवश: इस तरह वस्तु:सी # जेनिक्स: टी को रोकना जहां टी: ऑब्जेक्ट संकलित नहीं करता है; त्रुटि: बाधा विशेष वर्ग 'वस्तु'

Constraint cannot be special class 'object'

करता है इसका मतलब यह के साथ एक गर्भित अंतर नहीं है:

public interface IDoWork<T> where T : Object 
{ 
    T DoWork(); 
} 

मैं त्रुटि मिलती है निम्नलिखित संकलन करता है?

public interface IDoWork<T> // where T : Object 
{ 
    T DoWork(); 
} 
+7

सभी सी # कक्षा वस्तु के उप-वर्ग हैं। इस तरह की बाधा थोड़ा अजीब है :) –

+0

इसके लायक होने के लिए, मैं टी == ऑब्जेक्ट == शून्य को इस SO प्रश्न के रूप में बनाने की कोशिश कर रहा था: http: // stackoverflow।कॉम/क्यू/10644495/328397 – LamonteCristo

+2

यह बाधा अनावश्यक होगी, क्योंकि यह डिफ़ॉल्ट है ... –

उत्तर

14

दो बाधाओं के बीच कोई अंतर नहीं है, सिवाय इसके कि किसी को स्पष्ट रूप से राज्य के लिए बेकार होने की अनुमति नहीं है।

सी # 4.0 भाषा विनिर्देश (10.1.5 प्रकार पैरामीटर की कमी) का कहना है इस बारे में दो बातें:

The type must not be object. Because all types derive from object, such a constraint would have no effect if it were permitted.

...

If T has no primary constraints or type parameter constraints, its effective base class is object.

अपनी टिप्पणी में, आप ने कहा कि आप T प्रकार Void का हो बनाने की कोशिश कर रहे थे। Void एक विशेष प्रकार है जो इंगित करता है कि कोई रिटर्न प्रकार नहीं है और T के स्थान पर उपयोग नहीं किया जा सकता है, जिसके लिए उचित ठोस प्रकार की आवश्यकता होती है। यदि आप दोनों चाहते हैं तो आपको अपनी विधि का एक शून्य संस्करण और T संस्करण बनाना होगा।

+1

+1: यह ओपी के इरादे को संबोधित करता है। – Douglas

+0

हालांकि structs के बारे में क्या? मैंने इसे 'int' जैसी गैर-शून्य चीज़ों के एक टन को अस्वीकार करने की कोशिश की। – Nyerguds

42

यदि आप एक सामान्य प्रकार को संदर्भ प्रकार के रूप में बाध्य करना चाहते हैं, तो : class का उपयोग करें।

public interface IDoWork<T> where T : class 
{ 
    T DoWork(); 
} 

यह एक मान प्रकार, int इस तरह के रूप में या एक struct होने से सामान्य प्रकार ना करे होगा।

+4

मुझे नहीं पता कि इंटरफ़ेस का क्या उपयोग किया जाता है, लेकिन यह मान प्रकारों को प्रतिबंधित करने के लिए अजीब लगता है ... एक कार्य जो int या bool देता है वह काफी आम है। –

+2

आपका बिंदु मान्य है, लेकिन मुझे नहीं पता कि ओपी का इरादा क्या है। मैंने माना कि 'ऑब्जेक्ट' का मतलब था कि वे संदर्भ प्रकारों को बाधित करने की कोशिश कर रहे थे। – Douglas

+2

@ थॉमस लेवेस्क: ऐसी कई स्थितियां हैं जहां जेनेरिक कोड किसी संदर्भ प्रकार के साथ काम करेगा, लेकिन किसी भी सामान्य मूल्य प्रकार के साथ काम नहीं कर सकता है; एक साधारण उदाहरण कोई भी कोड होगा जो या तो 'Interlocked.CompareExchange' या अन्य सामान्य जेनेरिक कक्षाओं का उपयोग करता है जो ऐसा करता है। एक 'संरचना' बाधा काफी उपयोगी नहीं है, हालांकि यह किसी प्रकार को 'Nullable ' के रूप में उपयोग करने की अनुमति देती है। साथ ही, ऐसी स्थितियां हैं जहां इंटरफ़ेस लागू करने वाले मान प्रकार "ठीक से" काम कर सकते हैं, लेकिन इंटरफ़ेस को लागू करने वाले वर्ग संभवतः काम नहीं कर सकते हैं। – supercat

0

प्रति सी # 4.0 भाषा विशिष्टता के रूप में (कोडित: [10.1.5] पैरामीटर की कमी टाइप करें) दो बातें बताता है: प्रकार के प्रकार के

1] The type must not be object. Because all types derive from object, such a constraint would have no effect if it were permitted.

2] If T has no primary constraints or type parameter constraints, its effective base class is object.

जब आप एक सामान्य वर्ग को परिभाषित, आप प्रतिबंध लागू कर सकते हैं कि क्लाइंट कोड टाइप क्लास के लिए उपयोग कर सकता है जब यह आपकी कक्षा को तुरंत चालू करता है। यदि क्लाइंट कोड किसी प्रकार का उपयोग करके अपनी कक्षा को तुरंत चालू करने का प्रयास करता है जिसे किसी बाधा द्वारा अनुमति नहीं है, तो परिणाम संकलन-समय त्रुटि है। इन प्रतिबंधों को बाधा कहा जाता है। जहां प्रासंगिक कीवर्ड का उपयोग करके बाधाओं को निर्दिष्ट किया जाता है। यदि आप एक सामान्य प्रकार को संदर्भ प्रकार के रूप में बाध्य करना चाहते हैं, तो इसका उपयोग करें: कक्षा।

-MSDN

बाधा अनुसार विशेष वर्ग 'पहचानकर्ता' नहीं हो सकता। निम्नलिखित प्रकार की कमी के रूप में इस्तेमाल नहीं किया जा सकता है:

  • System.Object
  • System.Array
  • System.Delegate
  • System.Enum
  • System.ValueType।
+0

यह उत्तर उपयोगी होगा अगर यह समझाया गया * क्यों * ये बाधाओं के रूप में सार्थक नहीं हैं, और इसके बजाय क्या करना है। मेरे पास ऐसे प्रश्नों का उत्तर नहीं है, लेकिन यहां बाधाओं की अधिक चर्चा के साथ एक और लिंक है: https://msdn.microsoft.com/en-us/library/d5x73970.aspx – ToolmakerSteve

+0

@ToolmakerSteve मैंने अपना जवाब विस्तृत किया है एक सा। –