पर प्रतिनिधि को नहीं डाला जा सकता है हम प्रतिनिधि का एक सामान्य प्रकार T
पर क्यों नहीं डाल सकते?एक सामान्य प्रकार टी
एक उपयोगिता विधि CreateDelegate
कि टी है, जो एक प्रतिनिधि है, यानी एक प्रकार MulticastDelegate
से प्राप्त होता है का एक उदाहरण बनाता है पर विचार करें।
T CreateDelegate<T>() {… }
दुर्भाग्य से जेनरिक एक प्रकार MulticastDelegate
निम्नलिखित संकलन त्रुटि देने से प्राप्त होने वाले T
में रोके करने के लिए अनुमति नहीं देता:
Constraint cannot be special class 'System.MulticastDelegate'
फिर भी, इस उपयोगिता विधि है कि T
जाँच कर रहा है MulticastDelegate
साथ संगत है और Delegate::CreateDelegate
के माध्यम से प्रतिबिंब के माध्यम से एक प्रतिनिधि बनाते हैं। लेकिन, अगर हम T
को Delegate::CreateDelegate
का परिणाम कास्ट करने के लिए प्रयास करते हैं, हम निम्नलिखित संकलन त्रुटि मिल जाएगा:
Cannot convert type 'System.Delegate' to 'T'
हालांकि, अगर मैं यह पहली बार object
लिए डाली और फिर T
लिए यह ठीक से काम करेगा:
T h = (T) ((object) Delegate.CreateDelegate(typeof(T), target, m));
हम सीधे टी को प्रतिनिधि क्यों नहीं दे सकते?
यह काम करता है: 'टी एच = प्रतिनिधि। क्रेतेडिलेट (टाइपोफ (टी), लक्ष्य, एम) टी के रूप में;' '? –
हाँ, यह काम करता है। और, यह भी कम समझ में आता है। आईएमएचओ दोनों ऑपरेटरों का व्यवहार ('as' और _cast_) संगत होना चाहिए। –
इस तरह ऑब्जेक्ट से टी तक ऑब्जेक्ट कास्टिंग करने से अधिक सुरक्षित है, अगर यह –