2010-09-09 8 views
5

मैं पूर्णांकों की तरह कुछ बुनियादी आदिम प्रकार पर सदस्य की कमी का समर्थन एक स्थिर विस्तार विधि को लागू करने की जरूरत है, तैरता है, आदि यहाँ पर हस्ताक्षर किए पूर्णांक के लिए मेरे कोड है:स्टेटिक विस्तार सदस्य की कमी समर्थन तरीकों

module MyOperators = 
    let inline foo (x : ^T) = (^T : (static member Foo : ^T -> int) (x)) 

    type System.Int32 with 
     static member Foo(x : Int32) = 7 // static extension 

टेस्ट कोड:

The type 'System.Int32' does not support any operators named 'Foo'

डब्ल्यू:

open MyOperators  
let x = foo 5 // x should be 7 

लेकिन संकलक त्रुटि के साथ शिकायत क्या मैं यहाँ लापता हूँ? धन्यवाद!

+0

यदि मैं आपको सही ढंग से समझ रहा हूं, तो मुझे लगता है कि यदि आप ऐसा कर सकते हैं, तो यह विशेष रूप से अच्छा विचार नहीं है। बुनियादी भाषा तंत्र के साथ छेड़छाड़ ने हमेशा मुझे एक विरोधी पैटर्न के रूप में मारा है। इस तथ्य के बारे में सोचें कि भविष्य में किसी भी समय आपके अलावा किसी को भी इस कोड पर काम करना पड़ सकता है। भविष्य में किसी बिंदु पर आपको यह कोड स्वयं भी बनाए रखना पड़ सकता है जब आपने थोड़ी देर के लिए इस पर काम नहीं किया है। आंतरिक प्रकारों में संशोधन कई "डब्ल्यूटीएफ" का कारण बन सकता है? क्षणों। –

उत्तर

5

एफ # में स्टेटिक सदस्य बाधाओं को कभी भी 'एक्सटेंशन विधियों' नहीं मिलते हैं, वे केवल प्रकारों पर आंतरिक तरीकों को देख सकते हैं (और कुछ विशेष मामलों को एफ # भाषा स्पेक में बुलाया जाता है)।

शायद आप इसके बजाय विधि अधिभार का उपयोग कर सकते हैं? आपका अंतिम लक्ष्य क्या है?

+0

धन्यवाद। अंतिम लक्ष्य FSharp.Core.Operators, जैसे त्रिकोणमितीय कार्यों, आदि के लिए आंतरिक रूप से अपना स्वयं का सेट जोड़ना था। – Stringer

3

एफ # की स्थिर प्रकार की बाधाएं विस्तार विधियों के साथ काम नहीं करती हैं। एक्सटेंशन विधियों को संकलित समय पर स्थिर रूप से चेक नहीं किया जा सकता है, और फिर भी, आपके पास Int32 :: Foo (आपके द्वारा आयात किए गए नेमस्पेस के आधार पर) के लिए कई परिभाषाएं हो सकती हैं।

दुर्भाग्यवश, आपकी समस्या का समाधान करने के लिए आपको प्रतिबिंब का उपयोग करना पड़ सकता है।

+0

ठीक है, मुझे लगता है, यह एक अच्छा कारण लगता है। धन्यवाद! – Stringer

+6

मुझे नहीं लगता कि यह तकनीकी रूप से अक्षम है - विस्तार विधियों को संकलित समय पर स्थिर रूप से चेक किया जाता है (जब आप उन्हें कॉल करते हैं), इसलिए उन्हें सदस्य बाधाओं द्वारा भी स्वीकार किया जा सकता है। यह समझ में आता है कि यह समर्थित नहीं है, लेकिन यह संभव होना चाहिए ... –

+0

अच्छा कॉल, मेरा बुरा। –

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

  • कोई संबंधित समस्या नहीं^_^