2010-04-07 14 views
7

के एक निम्न उदाहरण करते हैं:नामस्थान सी # में सामान्य प्रकार के लिए उपनाम scoped

public class X { } 
public class Y { } 
public class Z { } 

public delegate IDictionary<Y, IList<Z>> Bar(IList<X> x, int i); 

public interface IFoo 
{ 
    // ... 
    Bar Bar { get; } 
} 

public class Foo : IFoo 
{ 
    // ... 
    public Bar Bar 
    { 
     get 
     { 
      return null; //... 
     } 
    } 
} 

void Main() 
{ 
    IFoo foo; //= ... 
    IEnumerable<IList<X>> source; //= ... 
    var results = source.Select(foo.Bar); // <- compile error here 
} 

संकलक का कहना है:

विधि 'System.Linq.Enumerable.Select (सिस्टम के लिए प्रकार तर्क .Collections.Generic.IEumerable, System.Func) ' उपयोग से अनुमानित नहीं हो सकता है। को प्रकार के तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें।

यह है, क्योंकि यह Func<IList<X>, int, IDictionary<Y, IList<Z>>> करने के लिए Bar परिवर्तित नहीं कर सकते।

यह बहुत अच्छा होगा अगर मैं सामान्य नामों के लिए टाइप नेमस्पेस स्कॉप्ड प्रकार उपनाम बना सकता हूं। तो मैं Bar को एक प्रतिनिधि के रूप में परिभाषित नहीं करता, बल्कि मैं इसे Func<IList<X>, int, IDictionary<Y, IList<Z>>> के लिए नामस्थान स्कोप्ड उपनाम के रूप में परिभाषित करता हूं।

public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>; 

मैं फिर नामस्थान स्कोप्ड उपनाम को परिभाषित कर सकता हूं उदा। IDictionary<Y, IList<Z>>

और यदि उचित रूप से उपयोग किया जाता है :), यह कोड को और अधिक पठनीय बना देगा। अब, मुझे सामान्य प्रकारों को रेखांकित करना है और असली कोड अच्छी तरह से पठनीय नहीं है :(

क्या आपको एक ही समस्या है :)? क्या कोई अच्छा कारण है कि यह सी # 3.0 में क्यों नहीं है? या कोई अच्छा कारण नहीं है, यह सिर्फ पैसे और/या समय का मामला है?

संपादित करें: मुझे पता है कि मैं using का उपयोग कर सकता हूं, लेकिन यह नामस्थान नहीं है - मेरे मामले के लिए इतना सुविधाजनक नहीं है।

EDIT2: comment by Joren देखें जहां वह सुझाव देता है कि संरचनात्मक टाइपिंग समस्या को भी हल कर सकती है।

+0

मुझे यकीन नहीं है कि 'उपयोग' के साथ समस्या क्या है - यह एक नया प्रकार परिभाषित नहीं करता है, लेकिन क्या आप चाहते हैं कि नहीं? –

+0

जैसा कि मैंने लिखा है, यह नामस्थान नहीं है, बल्कि फ़ाइल स्कॉप्ड है। मुझे सीएस फाइलों और असेंबली में उपनामों का उपयोग करने की आवश्यकता है। –

उत्तर

8

आप भाग्य से बाहर हो; उपयोग निर्देश केवल इसकी वर्तमान फ़ाइल को प्रभावित करता है। कोई नामस्थान-व्यापी प्रकार एलियासिंग तंत्र नहीं है।

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

+1

यदि मुझे गलत नहीं लगता है, तो प्रतिनिधियों पर संरचनात्मक टाइपिंग संकलक को इस विशिष्ट स्थिति से निपटने की अनुमति दे सकती है, यद्यपि एक बहुत ही अलग तरीके से।क्या कोई उचित मौका है कि प्रतिनिधियों जैसे चीजों के लिए संरचनात्मक टाइपिंग के लिए समर्थन कभी-कभी लागू किया जाएगा? – Joren

+0

@ जोरेन: हाँ, यह इस समस्या को हल करेगा। मुझे लगता है कि ज्यादातर लोगों को अब एहसास हुआ है कि शुरुआत से प्रतिनिधियों पर संरचनात्मक टाइपिंग बेहतर हो सकती है, लेकिन वह जहाज पार हो गया है। अब इसे बदलने के लिए यह एक बहुत बड़ा तोड़ने वाला बदलाव होगा। उस ने कहा, संरचनात्मक टाइपिंग में नई दिलचस्पी है, इसलिए मैं यह बयान नहीं देना चाहता हूं कि ऐसा होने का कोई * मौका नहीं है। –

0

यदि आप करते हैं ...

var results = source.Select((x, i) => foo.Bar(x, i)); 

यह उन्हें स्पष्ट रूप से निर्दिष्ट किए बिना ही आप के लिए प्रकार पता लगा सकते हैं।

(वैसे यह एक समाधान की तुलना में की एक काम के आसपास अधिक है)

+1

हां, मुझे पता है :) यह मेरे प्रश्न का उत्तर नहीं देता है, लेकिन धन्यवाद :) –