2009-05-20 10 views
299

मुझे अक्सर "त्रुटि समूह 'से' स्ट्रिंग 'में परिवर्तित नहीं किया जा सकता है जैसे कि:सी # में एक विधि समूह क्या है?

var list = new List<string>(); 
// ... snip 
list.Add(someObject.ToString); 

निश्चित रूप से आखिरी पंक्ति में एक टाइपो था क्योंकि मैं बाद में आमंत्रण कोष्ठक भूल गया था ToString। सही रूप होगा:

var list = new List<string>(); 
// ... snip 
list.Add(someObject.ToString()); // <- notice the parentheses 

हालांकि मुझे आश्चर्य हुआ कि एक विधि समूह क्या है। Google कोई मदद नहीं है और न ही MSDN है।

+52

धारा सी # 3.0 विनिर्देश के 7.1 को परिभाषित करता है "विधि समूह "। –

+1

मैंने इस त्रुटि को अब के रूप में पढ़ा है * जब आप एक विधि कॉल करते समय ब्रैकेट को याद करते हैं *। – niico

उत्तर

279

एक विधि समूह तरीकों के सेट के लिए नाम है (कि सिर्फ एक हो सकता है) - सिद्धांत में यानी ToString विधि कई भार के (प्लस किसी भी विस्तार विधि) हो सकता है: ToString(), ToString(string format), आदि - इसलिए ToString स्वयं ही एक "विधि समूह" है।

यह आम तौर पर ओवरलोड रिज़ॉल्यूशन का उपयोग करके एक विधि समूह को (टाइप किए गए) प्रतिनिधि में परिवर्तित कर सकता है - लेकिन स्ट्रिंग आदि के लिए नहीं; यह समझ में नहीं आता है।

एक बार जब आप ब्रांड्स जोड़ते हैं, फिर से; ओवरलोड रिज़ॉल्यूशन में आता है और आपने अनजाने में एक विधि कॉल की पहचान की है।

+6

विधि समूह के सामान्य उपयोग क्या होंगे? चूंकि (इसलिए मैं समझता हूं) इसका वही नाम पैरामीटर गिनती है और/या प्रकार अलग-अलग होंगे। तो आप समूह का उपयोग कर विधि समूह से एक से अधिक तरीकों का आह्वान नहीं कर सकते हैं। –

+23

यह पूरी तरह से एक कंपाइलर शब्द है "मुझे पता है कि विधि का नाम क्या है, लेकिन मुझे हस्ताक्षर नहीं पता"; रनटाइम पर इसका कोई अस्तित्व नहीं है। AFAIK, एक विधि-समूह * का एकमात्र उपयोग * स्वयं (* कोई ब्रैकेट इत्यादि) प्रतिनिधि निर्माण के दौरान होता है। –

+16

ईसीएमए 334v4 §14.1: एक विधि समूह का उपयोग किसी आमंत्रण-अभिव्यक्ति (§14.5.5) में किया जा सकता है, जो प्रतिनिधि-निर्माण-अभिव्यक्ति (§14.5.10.3) में उपयोग किया जाता है, या स्पष्ट रूप से एक संगत प्रतिनिधि प्रकार में परिवर्तित हो जाता है। किसी भी अन्य संदर्भ में, एक विधि समूह के रूप में वर्गीकृत एक अभिव्यक्ति संकलन-समय त्रुटि का कारण बनती है। –

16

अपने MSDN खोज में पहला परिणाम ने कहा:

विधि समूह को दर्शाता है एक आह्वान करने के लिए, या जहां से को अतिभारित तरीकों में से सेट एक विशिष्ट विधि का चयन आह्वान करने के लिए

विधि

मेरी समझ मूल रूप से है क्योंकि जब आप केवल someInteger.ToString लिखते हैं, तो यह संदर्भित हो सकता है:

Int32.ToString(IFormatProvider) 

या यह उल्लेख कर सकते हैं करने के लिए:

Int32.ToString() 

तो यह एक विधि समूह कहा जाता है।

15

ToString फ़ंक्शन में कई ओवरलोड हैं - विधि समूह उस समूह के लिए सभी अलग-अलग अधिभारों वाला समूह होगा।

+1

हां, और बिंदु यह है कि एक विधि समूह संकलन-समय का निर्माण होता है। संकलक उस संदर्भ के अनुसार एक विधि अधिभार चुनता है जहां संदेश समूह का उपयोग किया जाता है। उदाहरण के लिए: आप "var x = foo;" नहीं लिख सकते (जहां फू एक विधि समूह है), संकलक इसे अस्वीकार करता है भले ही केवल एक अधिभार है। – Rolf

140

इसके अलावा, यदि आप LINQ का उपयोग कर रहे हैं, तो आप स्पष्ट रूप से myList.Select(methodGroup) जैसे कुछ कर सकते हैं।

तो, उदाहरण के लिए, मेरे पास है:

private string DoSomethingToMyString(string input) 
{ 
    // blah 
} 

इसके बजाय स्पष्ट रूप से चर बताते हुए की इस तरह इस्तेमाल किया जा रहा:

public List<string> GetStringStuff() 
{ 
    return something.getStringsFromSomewhere.Select(str => DoSomethingToMyString(str)); 
} 

मैं वर के नाम बस छोड़ सकते हैं:

public List<string> GetStringStuff() 
{ 
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString); 
} 
+95

एक रेसपर सिफारिश है जो मुझे विधि समूह की खोज करने के लिए प्रेरित करती है। ReSharper मेरे linq अभिव्यक्तियों में से एक के लिए क्या कर रहा है यही है। –

+42

@a_hardin: ReSharper FTW! मैंने Resharper के लिए LINQ धन्यवाद के बारे में बहुत कुछ सीखा। –

+1

तो क्या इसके लिए कोई नीचे पक्ष हैं? एक ऐसा क्यों नहीं करेगा "नहीं"? – JCisar

17

आप एक प्रतिनिधि में विधि समूह डाल सकते हैं।

प्रतिनिधि हस्ताक्षर समूह से 1 विधि का चयन करता है।

यह उदाहरण उठाता ToString() अधिभार जो एक स्ट्रिंग पैरामीटर लेता है:

Func<string,string> fn = 123.ToString; 
Console.WriteLine(fn("00000000")); 

यह उदाहरण उठाता ToString() अधिभार जो कोई पैरामीटर लेता है:

Func<string> fn = 123.ToString; 
Console.WriteLine(fn()); 
संबंधित मुद्दे