2011-04-28 6 views
9

मेरे पास एक ऐसा फ़ंक्शन है जो सामान्य पैरामीटर लेता है, और इसके अंदर मुझे पैरामीटर के प्रकार के आधार पर दो कार्यों में से एक को निष्पादित करने की आवश्यकता होती है।एफ #: मैं पैटर्न प्रकार कैसे मेल करूं?

member this.Load<'T> _path = 
    let hhType = typeof<HooHah> 
    match typeof<'T> with 
     | hhType -> this.LoadLikeCrazy<'T> _path 
     | _ -> this.LoadWithPizzaz<'T> _path 

.... जहां लोडलाइकक्रैजी और लोडविथपाइज़ दोनों एक 'टी।

वीएस मुझे सूचित करता है कि वाइल्डकार्ड केस कभी निष्पादित नहीं होगा, क्योंकि मुझे स्पष्ट रूप से संकलन समय पर जेनेरिक का प्रकार मिल रहा है, न कि रनटाइम पर वास्तविक प्रकार। यह कैसे करना है?

उत्तर

13

अपने कोड में, पहला पैटर्न मिलान नियम < 'T> के साथ hhType के विरुद्ध तुलना नहीं करता है। इसके बजाए, यह एचएचटीपी नामक एक नया मूल्य पेश करेगा। यही कारण है कि आपको चेतावनी मिली है। मैं इस तरह के कोड को संशोधित करना चाहता हूं।

member this.Load<'T> _path =   
    match typeof<'T> with   
    | x when x = typeof<HooHah> -> this.LoadLikeCrazy<'T> _path   
    | _ -> this.LoadWithPizzaz<'T> _path 
+0

मीठा, धन्यवाद nyinyithann! – MiloDC

2

_path'T का एक उदाहरण है?

member this.Load<'T> _path = 
    if typeof<'T> = typeof<HooHah> then this.LoadLikeCrazy<'T> _path 
    else this.LoadWithPizzaz<'T> _path 

त्रुटि के लिए कारण यह है कि hhType अपने match अभिव्यक्ति के भीतर hhType की पूर्व घोषणा पीछा कर रहा है: यदि हां, तो Talljoe के समाधान के लिए काम करेंगे, अन्यथा आप की तरह कुछ करना होगा। तो, यह केवल आपके मिलान अभिव्यक्ति के मूल्य को एक नए बाध्यकारी में कैप्चर कर रहा है। यह सब कुछ मेल खाता है, इसलिए आपकी वाइल्डकार्ड की स्थिति कभी भी हिट नहीं होगी।

0

क्या nyinyithann का उल्लेख किया गया सही है। मैंने नीचे दिए गए कोड को एफ #

let Hello name = 
let n = "Sample" 
match name with 
| n -> 1 
| _ -> 0 

को वही चेतावनी मिली। खेतों में प्रयुक्त परावर्तक देखने के लिए कोड उत्पन्न कर रहा है और नीचे दिए गए कोड पाया (सी # में decompiled)

public static int Hello<a>(a name) 
{ 
    a local = name; 
    a name = local; 
    return 1; 
} 
नहीं

यकीन है कि क्यों संकलक इस :(किया था। किसी को भी इस व्यवहार का वर्णन कर सकते हैं?

+0

क्या आप अपने कोड से व्यवहार की अपेक्षा करते हैं? आप पैटर्न पर मिलान करते हैं यानी (मैच नाम के साथ) तो आप दो विकल्प प्रदान करते हैं, पहले नियम में आप एक नया चर बाध्यकारी बनाते हैं, जिसे "नाम" भी कहा जाता है, और फिर 0 लौटाता है। किसी भी पैटर्न को निर्दिष्ट न करें या जब पहले नियम की रक्षा की जाए तो हमेशा मिलान किया जाएगा, जिसका अर्थ है कि दूसरा नियम अनावश्यक है। आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? – Robert

+0

मैंने कोड अपडेट किया है .. वास्तव में पहला पैटर्न था: एन -> 1 ... इसे देने के बाद ऐसा लगता है कि "नाम" (चर) - इस मामले में "एन" - मिलान के अंदर परिभाषित किया गया है, इसका अपना दायरा है और मैच ब्लॉक – Ankur

+1

से पहले बाइंडिंग के साथ कुछ लेना देना नहीं है शाब्दिक विशेषता का उपयोग कर आप जिस व्यवहार की तलाश में हैं, उसे प्राप्त कर सकते हैं, क्रिस स्मिथ के पास अधिक जानकारी है: http://blogs.msdn.com/b/chrsmith/archive/2008/10/03/f-zen-the-literal- attribute.aspx – Robert