2012-01-26 14 views
5

में जेनेरिक प्रकारों के रनटाइम जबरन मेरे पास एफ # में स्पष्ट जेनेरिक तर्कों के साथ एक बेस क्लास है। मैं यह जांचने की कोशिश कर रहा हूं कि दिए गए प्रकार का उपयोग मैं एक विशिष्ट इंटरफ़ेस लागू करता हूं या नहीं। मैंने सोचा था कि "अगर ओब: ISysAware फिर" जानकारी के आधार पर यह क्रम बलात्कार या प्रकार से प्रकार परीक्षण 'ISysAware करने के लिए एक शामिल है एक अनिश्चित प्रकार: करना होगा, लेकिन शिकायत हमेशा एक ही है:एफ #

let (|SysAware|_|) t = 
    match t with 
    | :? ISysAware as p -> Some(p) 
    | _ -> None 

त्रुटि FS0008 इस कार्यक्रम बिंदु से पहले। कुछ प्रकारों पर रनटाइम प्रकार परीक्षण की अनुमति नहीं है। आगे के प्रकार एनोटेशन की आवश्यकता है।

मैं स्पष्ट रूप से यहां प्रतिबिंब का उपयोग नहीं करना चाहूंगा। IsAssignable है एक उच्च लागत पर, चाल चल जाएगा।

विचार?

उत्तर

12

कुछ एफ # प्रकार मूल्य प्रकार हैं; box जोड़ने सुनिश्चित करता है कि प्रकार परीक्षण केवल संदर्भ के प्रकार पर किया जाता है:

let (|SysAware|_|) t = 
    match box t with 
    | :? ISysAware as p -> Some(p) 
    | _ -> None 
+0

दिलचस्प है, लेकिन मैं क्या ज़रूरत है। – hammett

4

त्रुटि के लिए कारण प्रकार चेकर भ्रमित किया जा रहा है यह प्रकार, समाधान बाहर काम नहीं कर सकता के रूप में - पैड के समान को जोड़ने के लिए है ': struct और नहीं एक' एक: की कमी के रूप में अशक्त एक प्रकार एनोटेशन

let (|SysAware|_|) (t:obj) = 
    match t with 
    | :? ISysAware as p -> Some(p) 
    | _ -> None