2012-06-12 12 views
6

मैं इस के समान कई तरीके हैं:"आउट" पैरामीटर कार्रवाई के साथ (संदर्भ) <>

void GetColorSky(out float r, out float g, out float b) 
void GetColorGround(out float r, out float g, out float b) 

"समान" अर्थ वे ठीक उसी विधि हैडर विधि नाम छोड़ते हुए है। मेरे पास कई "colourPicker" नियंत्रण भी हैं, जो आर, जी, बी मान स्वीकार करते हैं।

मैं, एक विधि है कि यह के मानकों में से एक के रूप में एक विधि को स्वीकार करता है ताकि तरह करने के लिए कोशिश कर रहा हूँ:

UpdateColourPicker(ColorPicker cp, CustomMethod cMethod) 

और इसे कहते इस प्रकार है:

UpdateColourPicker(cpSky, GetColorSky) 
UpdateColourPicker(cpGround, GetColorGround) 

के लिए सही सिंटैक्स क्या है out और Action एक साथ? मैंने this question पर देखा है लेकिन मैंने अभी भी प्रबंधित नहीं किया है।

धन्यवाद!

+0

एक सामान्य दिशानिर्देश के रूप में, आपके कार्यों के लिए पैरा का उपयोग करने के बजाय मूल्य वापस करने के लिए बेहतर होगा क्योंकि वे गैर-संगत – Ankur

+0

कार्यों को रंगीन GetColorSky() 'जैसी विधियों को घोषित करने में क्या गलत है? उन सभी पैरामीटर मेरे लिए काफी अनावश्यक लगते हैं। – Botz3000

+0

@ अंकुर मेरे पास कोई विकल्प नहीं है। फ़ंक्शन सी # से नहीं आ रहे हैं लेकिन बाहरी डीएलएल से इसलिए मुझे संदर्भों का उपयोग करना होगा। मगर आपकी सलाह के लिए धन्यवाद। – David

उत्तर

3

कि जुड़ा हुआ जवाब से ले रहा है क्यू, इस काम करेगा:

public delegate void GetColorDel(out float r, out float g, out float b); 

void UpdateColourPicker(ColorPicker cp, GetColorDel cMethod) { } 

UpdateColourPicker(cpSky, GetColorSky); 
UpdateColourPicker(cpGround, GetColorGround); 

दुर्भाग्य से, के रूप में सवाल आप लिंक, के जवाब में कहा गया है Action और Funcout और ref साथ काम नहीं करते। यह बस इसलिए है क्योंकि Action और Func बीसीएल में जेनेरिक के साथ केवल प्रतिनिधि परिभाषाएं बताई गई हैं (अलग-अलग अधिभार प्रदान करने के लिए कुछ बार)। ref और out संस्करणों को जोड़ने से जल्दी से पुन: परिभाषा संकलक त्रुटियों का कारण बन जाएगा।

पूर्ण नमूना: बीसीएल में

delegate void ActionWithOutparameter<T>(out T x); 
delegate void ActionWithOutparameter<T1, T2>(out T1 x, out T2 y); 
// ... 

जाहिर Action और Func प्रतिनिधियों:

class Program 
{   
    public delegate void GetColorDel(out float r, out float g, out float b); 

    static void Main(string[] args) 
    { 
     UpdateColourPicker(null, GetColorSky); 
     UpdateColourPicker(null, GetColorGround); 

     Console.Read(); 
    } 

    static void GetColorSky(out float r, out float g, out float b) 
    { 
     r = g = b = 0f; 
     Console.WriteLine("sky"); 
    } 

    static void GetColorGround(out float r, out float g, out float b) 
    { 
     r = g = b = 0f; 
     Console.WriteLine("ground"); 
    } 

    static void UpdateColourPicker(object cp, GetColorDel cMethod) 
    { 
     float r, g, b; 
     cMethod(out r, out g, out b); 
    } 
} 
+0

वह जानना चाहता है कि 'एक्शन' प्रतिनिधियों में से किसी एक का उपयोग कैसे करें। – leppie

+0

@leppie: आपने पहले से ही ओपी को बताया है कि 'आउट' सामान्य प्रकारों के साथ समर्थित नहीं है, इसलिए आप स्पष्ट रूप से जानते हैं कि आप' कार्रवाई '> प्रतिनिधियों के साथ 'आउट' का उपयोग नहीं कर सकते हैं। मुझे यकीन नहीं है कि आपकी टिप्पणी क्या हो रही है। – Gabe

+0

@leppie मुझे पता है, और इसका उत्तर अपने स्वयं के लिंक किए गए प्रश्न में दिया गया है। मैं स्पष्ट होने के लिए संशोधन करूँगा। –

1

तुम बाहर पैरामीटर के साथ एक सामान्य प्रतिनिधि निर्धारित करना चाहते हैं, तो वह ऐसा किया जाना चाहिए इस हस्ताक्षर से मेल नहीं खाते।

संबंधित मुद्दे