के एक निम्न उदाहरण करते हैं:नामस्थान सी # में सामान्य प्रकार के लिए उपनाम 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 देखें जहां वह सुझाव देता है कि संरचनात्मक टाइपिंग समस्या को भी हल कर सकती है।
मुझे यकीन नहीं है कि 'उपयोग' के साथ समस्या क्या है - यह एक नया प्रकार परिभाषित नहीं करता है, लेकिन क्या आप चाहते हैं कि नहीं? –
जैसा कि मैंने लिखा है, यह नामस्थान नहीं है, बल्कि फ़ाइल स्कॉप्ड है। मुझे सीएस फाइलों और असेंबली में उपनामों का उपयोग करने की आवश्यकता है। –