2009-11-05 17 views
5

मेरे पास लंबे पैरामीटर स्वीकार करने वाली नई रेंज विधि जोड़ने के लिए सी # में संख्यात्मक वर्ग का विस्तार करने की स्थिति है। के बाद से विस्तार तरीकों केवल अपनी वस्तुओं के माध्यम से नहीं पहुंच रहे हैं मैं इससी # में संख्यात्मक वर्ग का विस्तार?

public static IEnumerable<long> Range(this Enumerable source, long start, long length) 
{ 
    for (long i = start; i < length; i++) 
    { 
     yield return i; 
    } 
} 

की तरह विधि को परिभाषित नहीं कर सकते हैं। और यह मुझे एक त्रुटि

'System.Linq.Enumerable' देता है: स्थिर प्रकार नहीं किया जा सकता के रूप में मानकों

मुझे स्पष्ट है कि कैसे इस

नोट करने के लिए कर सकते हैं someonce: मुझे पता है हम विस्तार विधियों के बिना इसे आसानी से हल कर सकते हैं, लेकिन मुझे इस Enumrable कक्षा की आवश्यकता है।

उत्तर

8

आप (मेरे जैसे) स्थिर विस्तार के तरीकों की तलाश कर रहे:

http://madprops.org/blog/static-extension-methods/

यह सी # में संभव नहीं है। निकटतम विकल्प एक और स्थिर वर्ग को एक समान नाम (LongEnumerable?) के साथ परिभाषित करना है और उस पर अपनी स्थिर विधि जोड़ें।

0

आप Enumerable कक्षा का विस्तार नहीं कर सकते हैं, क्योंकि आपके पास Enumerable उदाहरण नहीं है - यह static कक्षा है। विस्तार विधियां केवल उदाहरणों पर काम करती हैं, वे स्थिर वर्ग पर कभी भी काम नहीं करते हैं।

0

आपको इसके लिए अपनी खुद की उपयोगिता कक्षा बनाना होगा; आप विस्तार विधियों के माध्यम से स्थिर तरीकों को जोड़ सकते हैं।

5

एक्सटेंशन तरीकों केवल उदाहरणों एक प्रकार की पर कहा जा सकता है, और के बाद से Enumerable एक स्थिर प्रकार है वहाँ यह से किसी उदाहरण है, जिसका अर्थ है कि आप इसे विस्तार नहीं कर सकते कभी नहीं होगा।

IEnumerable<T> पर विस्तार के रूप में Range विधि को समझने का कोई मतलब नहीं है। आपकी विधि सिर्फ long मानों का अनुक्रम उत्पन्न करती है, इसे किसी विशेष उदाहरण को विस्तारित करने की आवश्यकता नहीं है।

var example = EnumerableUtils.Range(0, long.MaxValue).Where(x => (x % 2) == 0); 

// ... 

public static class EnumerableUtils 
{ 
    public static IEnumerable<long> Range(long start, long count) 
    { 
     for (long i = start; i < start + count; i++) 
     { 
      yield return i; 
     } 
    } 
} 
1

तुम क्यों System.Linq.Enumerable का विस्तार करना चाहते हैं:

बजाय एक मानक स्थिर उपयोगिता विधि का उपयोग करें? यह कक्षा IENumerable को लागू करने वाले अन्य प्रकारों को बढ़ाने के लिए एक्सटेंशन विधियों का उपयोग करती है।

परिणाम हो सकता है, जिसे आप कॉल चाहते हैं:

Enumerable.Range(long, long); 

आप बल्कि लंबे वर्ग सीधे विस्तार चाहते हैं: आप के साथ शुरू कर सकते हैं

public static IEnumerable<long> Range(this long source, long length) 
{ 
    for (long i = source; i < length; i++) 
    { 
     yield return i; 
    } 
} 

इस तरह

foreach (long item in 10.Range(20)) { } 
+0

'संख्यात्मक' एक स्थिर उपयोगिता वर्ग है। इसी कारण से वे 'int' की सीमा नहीं रखते थे, 'LongEnumerableTools' जैसी नई कक्षा बेहतर दृष्टिकोण है। – Aphelion

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