2011-06-16 17 views
6

एफ # 2.0 और FSI का उपयोग मैं निम्नलिखित है जा रहा हूँ:प्रकार निष्कर्ष और नए मैं शायद सिर्फ बेवकूफ

let foo = List(xs)//works 
let bar = new List(xs) //need type parameter 'The type System.Collectsion.Generic<_> expects 1 type argument 0 was given 

अब निश्चित रूप से मैं कर सकते हैं:

let baz = new List<TypeOItemsInXs>(xs)//why? 

अब वहाँ कुछ है मैं उचित रूप से कर सकता हूँ? मुझे कामकाजी प्रकार अनुमान या चेतावनियां मुफ्त कोड के बीच क्यों चुनना है (यदि 'सूची' डिस्पोजेबल है तो आपको एक चेतावनी मिलती है कि आपको इसके बारे में स्पष्ट होने के लिए 'नया' उपयोग करना चाहिए)।

कोई कामकाज? क्या यह एक बग या कुछ है?

उत्तर

13

तुम अब भी एक वाइल्डकार्ड _ साथ प्रकार निष्कर्ष का उपयोग कर सकते हैं:

open System.Collections.Generic 
let xs = [1;2;3] 

let bar = new List<_>(xs) 

Btw, भेद करने के लिए एफ # सूची और .NET List<T> कंटेनर, एफ # ResizeArray<T> को नेट List<T>, जो Microsoft.FSharp.Collections और इस में है नाम दिया गया है नामस्थान डिफ़ॉल्ट रूप से खोला जाता है:

let bar2 = new ResizeArray<_>(xs) 
8

यिन झू उत्तर सही है, मैं एक विवरण जोड़ना चाहता हूं। एफ # में आप new कीवर्ड के साथ या उसके बिना .NET रचनाकारों को कॉल कर सकते हैं। यदि new छोड़ा गया है तो सामान्य पैरामीटर जोड़ने की कोई आवश्यकता नहीं है, लेकिन यदि आप new का उपयोग करते हैं तो आपको एक जेनेरिक पैरामीटर जोड़ना होगा, भले ही आप वाइल्डकार्ड _ का उपयोग करके कार्य को टाइप करें।

इस प्रकार, आप कह सकते हैं:

> ResizeArray([1; 2; 3;]);; 
val it : System.Collections.Generic.List<int> = seq [1; 2; 3] 

या

> new ResizeArray<_>([1; 2; 3;]);; 
val it : ResizeArray<int> = seq [1; 2; 3] 

लेकिन नहीं:

> new ResizeArray([1; 2; 3;]);; 

    new ResizeArray([1; 2; 3;]);; 
    ----^^^^^^^^^^^ 

C:\Temp\stdin(5,5): error FS0033: The type 'Microsoft.FSharp.Collections.ResizeArray<_>' expects 1 type argument(s) but is given 0 
+0

IMO यह और भी बेहतर है। 'नया' अनिवार्य है। – Daniel

+0

भी, मुझे लगता है कि जब आप एक आईडीस्पोज़ेबल बना रहे हैं, तो नए कीवर्ड का इस्तेमाल किया जाना चाहिए, अन्यथा इसे – Alex

+1

छोड़ दिया जाना चाहिए हाँ मेरी समस्या यह है कि मेरे पास एक डिस्पोजेबल प्रकार है, और नए को छोड़कर चेतावनी दी जाती है। अगर मैं नया जोड़ता हूं तो मैं यिन झू पॉइंट्स के रूप में वाइल्डकार्ड का उपयोग कर दूर हो सकता हूं। यह सिर्फ अजीब लगता है कि भाषा इस तरह की विषम है: एस –

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