2012-12-13 31 views
11

मैं अपने MessageBus निम्नलिखित विस्तार तरीकों:सी # विशेषज्ञता

public static class MessageBusMixins 
{ 
    public static IDisposable Subscribe<T>(
     this IObservable<T> observable, 
     MessageBus bus) 
    where T:class 
    { 
     ... 
    } 

    public static IDisposable Subscribe<T>( 
     this IObservable<Maybe<T>> observable, 
     MessageBus bus) 
    { 
     ... 
    } 
} 

जो ठीक संकलित करता है। लेकिन जब मैं इसे इस्तेमाल करने की कोशिश:

IObservable<Maybe<string>> source = ...; 
MessageBus bus = ...; 

source.Subscribe(bus); 

मैं त्रुटि है कि दो उम्मीदवार तरीकों के न सबसे विशिष्ट हैं मिलता है। हालांकि मैंने सोचा कि Maybe<T> T से विशिष्ट है या यह सही नहीं है?

संपादित

क्योंकि अगर मैं विस्तार विधि स्पष्ट रूप से तो फोन यह कुरिओसेर हो जाता है:

MessageBus.SubscribeTo(source, bus); 

तो यह काम करता है और सही विधि चुनता है।

+0

आप यह काम कर सकते हैं के रूप में उम्मीद: 'जनता स्थिर IDisposable सदस्यता लें ( इस IObservable नमूदार, MessageBus बस) जहां टी: शायद ' – 2kay

+0

टी शायद bradgonesurfing

+3

@ 2kay जेनेरिक की कमी नहीं हो सकता का हिस्सा नहीं हैं उम्मीदवार संकल्प प्रक्रिया, ताकि – SWeko

उत्तर

9

ठीक है, आप इसे प्रकार तर्क को निर्दिष्ट करके ठीक कर सकते हैं:

source.Subscribe<string>(bus); 

... के रूप में है कि अब केवल दूसरी विधि लागू है।

source.Subscribe<string>(bus); 
source.Subscribe<Maybe<string>>(bus); 

अगर आपको लगता है प्रथम, द्वितीय की तुलना में अधिक विशिष्ट है, तो आप सी # विनिर्देश जो कहते हैं तो :) यह में शासन को ढूंढना होगा:

अन्यथा, संकलक के दोनों कह सकते हैं एक अनुचित उम्मीद नहीं है, लेकिन मुझे नहीं लगता सामान्य "अधिक विशिष्ट" रूपांतरण पैरामीटर पर नियमित पैरामीटर पर लागू होते हैं।

उदाहरण के लिए

तो, खंड सी # 4 कल्पना ("बेटर समारोह सदस्य") की 7.5.3.2 में वहाँ एक नियम के बारे में:

  • अन्यथा यदि एम पी की तुलना में अधिक विशिष्ट पैरामीटर प्रकार हैं एम क्यू, फिर एम पी एम क्यू से बेहतर है। [... के बारे में कम/अधिक विशिष्ट विवरण के बहुत सारे ...]

... लेकिन प्रकार पैरामीटर के बारे में कोई समान मतलब नहीं है। (सामान्य पैरामीटर के बारे में दूसरा टाइप तर्कों के बारे में बात करता है, लेकिन यह पैरामीटर प्रकारों के भीतर है।)

एक और विकल्प यह है कि विधियों को अलग-अलग नाम दें। क्या उनके पास बहुत अलग व्यवहार है? यदि हां, तो नामकरण के माध्यम से वास्तव में स्पष्ट क्यों न करें? आप वास्तव में किसी को गलत व्यवहार नहीं करना चाहते हैं क्योंकि वे आश्चर्यचकित थे कि किस अधिभार को बुलाया गया था।

+1

हाय जॉन काम नहीं करेगा। मैंने विस्तार विधि को कॉल करने के साथ प्रश्न को अद्यतन किया है जो अलग-अलग परिणाम देता है। एक्सटेंशन विधियां विशेषज्ञता के लिए अक्षम क्यों हैं जबकि प्रत्यक्ष कॉल हैं। क्या यह मानक की आपकी समझ के साथ फिट है। – bradgonesurfing

+0

इस मामले में मैं प्रत्यक्ष कॉल के साथ जाऊंगा क्योंकि यह मेरे लिए समय सुरक्षित है। – bradgonesurfing