2009-09-25 14 views
8

मुझे आज सी # के साथ कुछ सामना करना पड़ा जिसे मैंने पहले नहीं सोचा था। मेरे पास मेरी कक्षा में दो विधियां हैं, एक दूसरे का अधिभार है। वे इतने तरह की घोषणा की जाती:सी # पैराम्स एक ही प्रकार के दो पैरामीटर के साथ कीवर्ड

1) public void RequirePermissions(params string[] permissions)... 
2) public void RequirePermissions(string message, params string[] permissions)... 

मेरे कोड में, मैं तो जैसे पहले एक कॉल करने की कोशिश:

RequirePermissions("Permission1", "Permission2"); 

... यह उम्मीद पहले अधिभार कॉल करने के लिए। वैसे यह दूसरा अधिभार कहा जाता है। एक ही रास्ता मैं इसे इस मामले में पहली विधि कॉल करने के लिए प्राप्त कर सकते हैं मैन्युअल रूप से इस तरह की स्ट्रिंग [] वस्तु पारित करने के लिए है:

RequirePermissions(new string[] { "Permission1", "Permission2" }); 

अब, यह व्यवहार मुझे भ्रमित नहीं है क्योंकि मैं समझता हूँ कि संकलक कर सकते हैं यह नहीं बताएं कि मैं वास्तव में मेरे प्रदत्त पैरामीटर के आधार पर कौन सी विधि कॉल करना चाहता हूं। लेकिन क्या मुझे सावधान नहीं था कि यह मेरे कोड में अनजान हो सकता था। ऐसा लगता है कि माइक्रोसॉफ्ट को कंपाइलर को एक त्रुटि को फेंकना चाहिए था जब इसे ऊपर की स्थिति का सामना करना पड़ा था। क्या किसी के पास इस बारे में कोई विचार है? क्या मैंने पोस्ट किए गए "समाधान" के अलावा पहले अधिभार को कॉल करने का कोई और तरीका है?

+0

यहां एक नज़र डालें- http://ayende.com/Blog/archive/2007/12/31/Tricky-Code.aspx और यहां- http: //www.yoda.arachsys ।com/csharp/teasers.html (संख्या 6) – RichardOD

+1

मैं आपके सुझाव से थोड़ा उलझन में हूं। क्या आपको लगता है कि चेतावनी अस्पष्ट * कॉल *, या * घोषणाओं * के सेट पर होनी चाहिए जो एक अस्पष्ट कॉल का कारण बन सकती है? –

उत्तर

2

हाँ, मैं मानता हूँ यह शायद एक चेतावनी हो जब चर लंबाई तर्क सरणियों का उपयोग कर एक अस्पष्ट अधिभार का कारण बनता है चाहिए - यह बहुत ज्यादा बढ़त मामला है, और लोगों को लगभग निश्चित रूप से ऐसी स्थितियों बनाने के लिए इसका मतलब यह नहीं है।

मुझे आपके द्वारा पोस्ट किए गए कॉल रिज़ॉल्यूशन से बचने के अलावा किसी अन्य तरीके से भी पता नहीं है - इसे पहले स्थान पर करने से बचने के अलावा, जिसे मैं अत्यधिक अनुशंसा करता हूं!

0

आप पैराम का उपयोग नहीं कर सकते और अपने हस्ताक्षर से स्पष्ट नहीं हो सके।

public void RequirePermissions(string[] permissions)... 
public void RequirePermissions(string message, string[] permissions).. 
7

एडम से सहमति जताते हुए, मैं इसे की तरह कुछ करने के लिए बदल देंगे:

public void RequirePermissions(params string[] permissions) 

public void RequirePermissionsWithMessage(string message, params string[] permissions) 
+0

अरे, मैंने अपना पोस्ट पोस्ट करने के बाद तक आपका जवाब नहीं देखा। कोड नमूने में स्क्रॉलबार मेरी आंखें चमकते हैं, मुझे लगता है। – MusiGenesis

+0

@ एससीटीएम: स्पष्ट रूप से नहीं। * मैंने * आपके * उत्तर को वोट दिया। :) – MusiGenesis

7

व्यक्तिगत रूप से, मैं इसे इस तरह से करना चाहते हैं:

1) public void RequirePermissions(params string[] permissions)... 
2) public void RequireMessageAndPermissions(string message, 
     params string[] permissions)... 

लोग के साथ प्यार में भी गिर कभी-कभी ओवरलोडिंग, और जब आप params कीवर्ड के लिए प्यार के साथ गठबंधन करते हैं, तो आप अंततः अपने कोड को ले जाने वाले किसी भी व्यक्ति के लिए भ्रम स्तर बढ़ाते हैं।

+0

+1 अच्छा विचार, और भी स्पष्ट –

3

ऐसा लगता है कि कोई अन्य तरीका नहीं है।

आप सी # कल्पना http://www.jaggersoft.com/csharp_standard /17.5.1.4.htm में इस व्यवहार के लिए स्पष्टीकरण प्राप्त कर सकते हैं और यहां http://www.jaggersoft.com/csharp_standard/14.4.2.1.htm (अनुच्छेद 2)

एक पैरामीटर सरणी ठीक एक मूल्य पैरामीटर (§17.5.1.1) एक ही प्रकार के के बराबर है।

और

एक विधि का विस्तृत रूप केवल तभी उपलब्ध हो विधि के सामान्य रूप है नहीं लागू और केवल तभी विस्तृत रूप के समान हस्ताक्षर से एक पद्धति पहले से ही नहीं है उसी प्रकार में घोषित

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