2014-04-10 4 views
16

यह एक बहुत ही असामान्य समस्या है और निश्चित रूप से कई कामकाज हैं, लेकिन मैं समझना चाहता हूं कि वास्तव में क्या चल रहा है और यह क्यों काम नहीं कर रहा है।
तो मैं एक परीक्षण समाधान में 3 विधानसभाओं है, सबसे पहले विधानसभा टाइप ClassA है:स्पष्ट कास्ट ऑपरेटर "असेंबली संदर्भित नहीं है" त्रुटि

public class ClassA 
{ 
    public string Name { get; set; } 
} 

दूसरा विधानसभा संदर्भ पहले विधानसभा और है ClassB:

public class ClassB 
{ 
    public string Name { get; set; } 

    public static explicit operator ClassA(ClassB objB) 
    { 
     return new ClassA 
     { 
      Name = objB.Name 
     }; 
    } 
} 

जो एक स्पष्ट ऑपरेटर टाइप करने के लिए कास्ट करने के लिए है कक्षा। आइए मान लें कि हम कुछ कारणों से विरासत का उपयोग नहीं कर सकते हैं और सिर्फ एक प्रकार को दूसरे प्रकार में बदलने के सुविधाजनक तरीके के रूप में कास्टिंग का उपयोग कर सकते हैं।

अब, पिछले विधानसभा संदर्भ दूसरा विधानसभा (! और नहीं पहले एक) और टाइप ClassC:

public class ClassC 
{ 
    public string Name { get; set; } 

    public static explicit operator ClassB(ClassC objC) 
    { 
     return new ClassB 
     { 
      Name = objC.Name 
     }; 
    } 
} 

जो ClassB रूप में एक ही कारण के लिए स्पष्ट डाली ऑपरेटर का उपयोग करता है।

अब दिलचस्प हिस्सा: अगर मैं ClassC से इस तरह, मेरे कोड में ClassB को कास्ट करने के लिए प्रयास करें:

ClassC objC = new ClassC(); 
ClassB objB = (ClassB)objC; 

मैं निम्नलिखित त्रुटि मिलती है:

Error 1 The type 'FirstAssembly.ClassA' is defined in an assembly that is not referenced. You must add a reference to assembly 'FirstAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

मैं आसानी से नई बना सकते हैं क्लासबी का उदाहरण और क्लाससी इंस्टेंस से मूल्यों के साथ इसे शुरू करें (जैसे मैं स्पष्ट कास्ट ऑपरेटर के अंदर करता हूं), और यह ठीक काम करेगा। तो यहाँ क्या गलत है?

+0

यदि आप इसे स्वयं करते हैं तो आप जानते हैं कि क्या करना है; लेकिन यदि आप कास्ट का उपयोग करते हैं तो आप ऑब्जेक्ट को कास्ट के नियमों के अनुसार कंपाइलर को बताते हैं, जिसे कक्षा ए के बारे में जानने की आवश्यकता है .. – TaW

+0

लेकिन क्यों? मैं कहीं भी कक्षा में कास्टिंग नहीं कर रहा हूं। क्या कोई स्रोत दस्तावेज़ है जहां कलाकारों के इन नियमों को विवरण में समझाया गया है? –

+0

दिलचस्प सवाल! मैंने इसे अपने आप परीक्षण किया और उम्मीद कर रहा था कि * 'क्लासबी' * का एक उदाहरण बनाना विफल हो जाएगा, क्योंकि रनटाइम 'क्लासबी' के स्पष्ट कलाकारों का मूल्यांकन नहीं कर सकता है। आश्चर्य की बात है कि यह काम किया! मुझे लगता है कि यह किसी भी तरह से बाध्यकारी स्थिर सदस्यों में संबंधित है। – Carsten

उत्तर

2

अनुभाग में, 6.4.5 उपयोगकर्ता-परिभाषित सी # भाषा विशिष्टता की स्पष्ट रूपांतरण (संस्करण 4.0) इसे पढ़ता है:

A user-defined explicit conversion from type S to type T is processed as follows:

• Determine the types S0 and T0. If S or T are nullable types, S0 and T0 are their underlying types, otherwise S0 and T0 are equal to S and T respectively.

• Find the set of types, D, from which user-defined conversion operators will be considered. This set consists of S0 (if S0 is a class or struct), the base classes of S0 (if S0 is a class), T0 (if T0 is a class or struct), and the base classes of T0 (if T0 is a class).

यह परिभाषित नहीं करता कैसे संकलक "के सेट मिलेगा प्रकार "लेकिन मुझे लगता है कि सभी प्रासंगिक वर्गों खोज अगले कदम के लिए उम्मीदवारों की तलाश में:

• Find the set of applicable user-defined and lifted conversion operators, U. This set consists of the user-defined and lifted implicit or explicit conversion operators declared by the classes or structs in D that convert from a type encompassing or encompassed by S to a type encompassing or encompassed by T. If U is empty, the conversion is undefined and a compile-time error occurs.

यह बात ClassA के संदर्भ में हल करने का प्रयास करने के लिए कारण बनता है।

+1

यह वास्तुकला है: आप प्रकार का संदर्भ लें, प्रकार का मेटाडाटा पार्स किया गया है और सदस्यों को आपके उपयोग के लिए उजागर किया गया है। कास्ट ऑपरेटर उन सदस्यों में से एक है। क्लासए के बारे में मेटाडेटा जानकारी को पार्स करते समय पाया जाता है, लेकिन कक्षा के मेटाडेटा स्वयं उपलब्ध नहीं हैं, न तो मूल पुस्तकालयों में और न ही असेंबली में आप पहले से ही संदर्भ दे रहे हैं। – Andrew

+0

आपका उत्तर कुछ समय के लिए गायब हो गया, मुझे खुशी है कि यह अभी वापस आ गया है, इसलिए मैं इसे स्वीकार कर सकता हूं। –

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