2011-04-16 14 views
10

मैं सी ++ जहां यह कुछ इस तरह ऐसा करना आसान है से आ रहा हूँ:जेनेरिक स्वैप कठिनाई

template<class T> 
void Swap(T &a, T &b) 
{ 
    T temp = a; 
    a = b; 
    b = temp; 
} 

और फिर इसका इस्तेमाल एक कंटेनर में मानों स्वैप करने के लिए:

std::vector<int> someInts; 
someInts.push_back(1); 
someInts.push_back(2); 

Swap(someInts[0], someInts[1]); 

हालांकि, प्रयास कर पर सी # में एक ही बात करने के लिए

void Swap<T>(ref T a, ref T b) 
{ 
     T temp = a; 
    a = b; 
    b = temp; 
} 

मैं त्रुटि "संपत्ति या इंडेक्सर एक बाहर या रेफरी पैरामीटर के रूप में पारित नहीं किया जा सकता है मिल "

यह क्यों है और मैं इसे कैसे दूर कर सकता हूं?

बहुत धन्यवाद

+0

गुण और indexers सुविधा उन्हें इस्तेमाल करने के लिए रूप में यदि वे मान रहे थे (भले ही हुड के नीचे वे कई तरीके हैं) की शुरुआत की हैं, लेकिन यह एक कारण है मुझे उन्हें पसंद नहीं है। कम से कम, आप जो काम करना चाहते हैं उसे बनाने का कोई तरीका होना चाहिए था, लेकिन वर्तमान में, अधिकांश नई भाषाएं उस बिंदु पर चूसती हैं। – comco

उत्तर

2

आप indexers या गुणों का उपयोग नहीं कर सकते मानकों रेफरी। कारण यह है कि आप ऑब्जेक्ट के संदर्भ को फिर से शुरू कर रहे हैं लेकिन स्थान नहीं, इसलिए फ़ंक्शन के किसी भी प्रभाव में वास्तव में स्रोत नहीं बदलेगा क्योंकि यह इसे वापस स्थान पर नहीं लिखता है (यानी सेटर को किसी मामले के मामले में नहीं बुलाता संपत्ति)। आपको सरणी को विधि में पारित करने की आवश्यकता है ताकि विधि मानों को एक इंडेक्स सेट कर सके और साथ ही यह जान सके कि कौन से मूल्य स्वैप करना है।

0

गुण और अनुक्रमणिका वास्तव में विधियां हैं (दृश्यों के पीछे कंपाइलर द्वारा बनाई गई), इसलिए मुझे लगता है कि उन पर कॉल-बाय-रेफरेंस करना संभव नहीं है। लेकिन अगर आप इस तरह की एक विधि लिख सकते हैं:

public void Swap<T>(T[] data, int a, int b) { 
    T temp = data[a]; 
    data[a] = data[b]; 
    data[b] = temp; 
} 

Swap(someInts, 0, 1); 
+0

हाँ मुझे पता है, लेकिन यह एक हैक की तरह लगता है। :(धन्यवाद। – mat

+1

एमएसडीएन से जानकारी के आधार पर ऐसा लगता है कि सी # में सरणी पॉइंटर्स का उपयोग करके किसी प्रकार की संरचना नहीं हैं (ऐसी चीजें असुरक्षित संदर्भ में मौजूद हैं) लेकिन सरणी सिस्टम से ली गई हैं। अरे, इसलिए कोई "तेज़/प्रत्यक्ष नहीं है एक्सेस "। अपना कोड क्लीनर बनाने के लिए आप उस कोड को एक विस्तार विधि में लपेट सकते हैं जो इसे और अधिक पठनीय बनाता है। – jCoder

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