2010-12-14 15 views
7

इस कोड का उपयोग करना:सी # Struct जेनेरिक निर्माता

Backing field for automatically implemented property 'Foo.Item1' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

मेरा प्रश्न है, क्यों संपत्ति Item1 पूरी तरह से निर्माता के बाद निर्दिष्ट नहीं की गई है कहा जाता है:

struct Foo<T1> 
{ 
    public T1 Item1 { get; private set; } 

    public Foo(T1 item1) 
    { 
     Item1 = item1; 
    } 
} 

मैं इस त्रुटि का सामना करना?

संपादित करें: set से private set बदल गया क्योंकि इस प्रश्न में उत्परिवर्तन के साथ कुछ भी नहीं है।

+10

कृपया परिवर्तनीय structs मत बनाओ, कृपया। –

+0

वह क्यों नहीं चाहिए? यह वास्तव में चीजों को कभी-कभी बहुत आसान बनाता है, और कुछ लूप-गहन मामलों में प्रदर्शन में काफी सुधार कर सकता है। उत्परिवर्तनीय structs के साथ क्या गलत है? (यह भी उनके प्रश्न का उत्तर नहीं देता है।) – Mehrdad

+0

@ लैम्बर्ट http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –

उत्तर

15

यहाँ this() जोड़ें:

public Foo(T1 item1) : this() 
{ 
    Item1 = item1; 
} 

यह क्योंकि आप एक संपत्ति के लिए बताए कर रहे हैं, और संकलक अनुमान नहीं कर सकता है कि संपत्ति केवल एक चर के लिए एक मूल्य प्रदान करती है; उदाहरण शुरू होने से पहले यह अन्य चीजें कर सकता है, और इसकी अनुमति नहीं है क्योंकि संरचना में कचरा डेटा हो सकता है। तो आपको इसे पहले डिफॉल्ट कन्स्ट्रक्टर के साथ प्रारंभ करना होगा, फिर आप जो चाहते हैं उसे करें।

+0

@ लैम्बर्ट: सवाल यह है कि संकलक स्पष्ट क्यों नहीं देख सकता? कंपाइलर अन्य मामलों में प्रवाह विश्लेषण का काफी अच्छा काम करता है। – Vlad

+0

मैंने कंपाइलर नहीं बनाया, इसलिए मुझे नहीं पता। :) लेकिन यह अन्य परिस्थितियों को रोकता है जहां संपत्ति स्वत: उत्पन्न नहीं होती है, और जहां आप कचरा डेटा का उपयोग करने का प्रयास करते हैं। इसके अलावा, मेरा मानना ​​है कि यह एक सीएलआर मुद्दा है, एक कंपाइलर मुद्दा नहीं - जेआईटी शिकायत कर सकता है अगर आप प्रोजेक्ट शुरू होने से पहले किसी संपत्ति तक पहुंचने का प्रयास करते हैं, क्योंकि इसमें ऐसी जानकारी नहीं है जो संकलक तुरंत उपलब्ध हो यह। – Mehrdad

+0

आप अपने स्वयं के डिफ़ॉल्ट कन्स्ट्रक्टर को स्पष्ट रूप से कार्यान्वित करके इसे हल करने में भी सक्षम हो सकते हैं। –

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