मैं एफ # में इस सी # के बराबर लिखना चाहते हैं:सार्वजनिक क्षेत्रों के साथ एक अपरिवर्तनीय संरचना कैसे घोषित करें?
struct Vector2 {
public readonly int X;
public readonly int Y;
public Vector2(int x, int y) {
X = x;
Y = y;
}
}
इस उपयोगकर्ता बलों एक उदाहरण बनाने के लिए तर्क की आपूर्ति करने [संपादित करें: यह मान प्रकार के लिए गलत है - सभी मूल्य प्रकार एक डिफ़ॉल्ट निर्माता है] । एक डिफ़ॉल्ट वेक्टर 2 को एक स्थिर रीडोनली फ़ील्ड के साथ भी प्रदान किया जा सकता है, यानी वेक्टर 2.जेरो।
यह एक ही रास्ता सार्वजनिक क्षेत्रों पाने के लिए की तरह लग रहा "वैल" कीवर्ड के माध्यम से है, लेकिन मुझे उन्हें डिफ़ॉल्ट निर्माता के साथ प्रारंभ करने देने के लिए प्रतीत नहीं होता है, और मैं दो कंस्ट्रक्टर्स है नहीं करना चाहती:
[<Struct>]
type MyInt(value) =
val public Value : int = value;;
val public Value : int = value;;
-------------------------------^
stdin(7,32): error FS0010: Unexpected symbol '=' in member definition
मुझे पता है कि यह सदस्य बाइंडिंग के साथ किया जा सकता है लेकिन यह गुणों को बनाता है, फ़ील्ड नहीं, अगर मैं अच्छी तरह समझता हूं।
दुर्भाग्य से यह मुझे पैरामीटर पास किए बिना वेक्टर बनाने देता है, जैसे: 'v = Vector2() '। यह नहीं कि यह एक बहुत ही गंभीर समस्या है, लेकिन मैं अभी भी सोच रहा हूं कि यह डिफ़ॉल्ट खाली कन्स्ट्रक्टर के बिना किया जा सकता है या नहीं। – Asik
@Aसिक: यह आपके सी # कोड के बारे में भी सच है - यह एक सीएलआर सीमा है, एफ # सीमा नहीं। – ildjarn
"स्ट्रक्चर के पास कोई तर्क नहीं होने पर ऑब्जेक्ट कन्स्ट्रक्टर नहीं हो सकता है। यह सभी सीएलआई भाषाओं पर लगाया गया प्रतिबंध है क्योंकि structs स्वचालित रूप से डिफ़ॉल्ट कन्स्ट्रक्टर का समर्थन करते हैं।" - यह संकलक कहता है, इसलिए आप जो भी चाहते हैं उसे हमेशा प्राप्त नहीं कर सकते ... –