2016-02-12 11 views
12
@{ 
    ViewBag.Username = "Charlie Brown"; 
    string title1 = string.Format("Welcome {0}", ViewBag.Username); 
    var title2 = string.Format("Welcome {0}", ViewBag.Username); 
} 

MVC ध्यान में रखते हुए मैं इस तरह मूल्यों का उपयोग करें:यह स्ट्रिंग क्यों नहीं है। फर्मेट() वापसी स्ट्रिंग, लेकिन गतिशील?

@Html.ActionLink(title1, "Index") 
@Html.ActionLink(title2, "Index") 

यहाँ, title1 ठीक काम करता है। लेकिन title2 ActionLink एक संकलक त्रुटि के साथ विफल:

CS1973: 'System.Web.Mvc.HtmlHelper' has no applicable method named 'StandardHeader' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

string.Format() काफी कुछ भार के है, लेकिन वापसी प्रकार हमेशा स्ट्रिंग है। var का उपयोग कर परिवर्तनीय घोषणा क्यों विफल हो जाती है?

+16

मुझे संदेह है कि आपके द्वारा दिए गए कोड से आपको वह त्रुटि संदेश मिला है। मुझे संदेह है कि यह कोड का एक अलग बिट है। –

उत्तर

16

ठीक है, इसलिए हम पहले से ही टिप्पणियों और अन्य उत्तरों से जानते हैं कि समस्या dynamic में है। चूंकि dynamicरनटाइम पर बाध्य है, केवल उस समय अधिभार रिज़ॉल्यूशन है और सत्यापन मान्य है।

तो: यदि पैरामीटर में से कम से कम एक dynamic है, तो ओवरलोड रिज़ॉल्यूशन रनटाइम पर किया जाता है।

है यही कारण है कि इस स्पष्ट गलती की अनुमति है:

dynamic x = ""; 
int i = string.Format("{0}", x); 

अगर वहाँ नहीं है एक string.Format अधिभार है कि एक int रिटर्न यह परेशान नहीं करता है। यह बाद में मूल्यांकन करता है।

+4

* सभी * अभिव्यक्तियों का मूल्यांकन रनटाइम पर किया जाता है, संकलन समय सारिणी पर कुछ संचालन के कभी-कभी अपवाद के साथ। यह 'गतिशील 'के लिए विशिष्ट नहीं है। यहां स्थगित किया गया है ओवरलोड रिज़ॉल्यूशन है और अभिव्यक्ति का प्रकार रनटाइम पर निर्धारित होता है। यह अलग है। – Servy

+0

ठीक है, उसे नहीं पता था। धन्यवाद @ सर्वी –

+0

कूल। यह बताता है क्यों। धन्यवाद। – Blaise

11

त्रुटि संदेश बिल्कुल क्या गलत यहाँ कह रहा है:

Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

title2 प्रकार dynamic की है। आपको इसे string पर डालना होगा, क्योंकि आप जानते हैं कि यह वही है।

+2

लेकिन यह 'गतिशील 'नहीं है, यह' string' है ... – David

+0

लेकिन 'string.Format()' 'गतिशील' नहीं लौटाता है। – CodeCaster

+9

@ डेविड - यदि 'ViewBag.Username' गतिशील है तो यह' गतिशील 'होगा। 'गतिशील' पूरी अभिव्यक्ति पर लागू होता है। – Lee

7

यह दृश्य बैग है जो गतिशील है। enter image description here

यदि आप वास्तविक उपयोगकर्ता नाम (ViewBag.UserName के बजाय) का उपयोग करते हैं तो यह काम करेगा। या स्ट्रिंग में (string)ViewBag.Username डालें।

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