मेरे पास ऐसी स्थिति है जहां मैं संकलक के व्यवहार को समझाऊंगा। हम Foo
वर्ग के हस्ताक्षर में बदलाव करते हैं तोमुहरबंद कीवर्ड एक कास्ट पर संकलक की राय को प्रभावित करता है
static class FooGetterGetter
{
public static IFoo<T> Get<T>()
{
return (IFoo<T>)new FooGetter();
}
}
और sealed
कीवर्ड जोड़ने:
interface IFoo<T>
{
T Get();
}
class FooGetter : IFoo<int>
{
public int Get()
{
return 42;
}
}
निम्नलिखित compiles और रन: एक छोटे से कोड को देखते हुए
sealed class FooGetter : IFoo<int> // etc
फिर मुझे निम्न पंक्ति पर एक कंपाइलर त्रुटि मिलती है:
return (IFoo<T>)new FooGetter();
के
:
'MyNamespace.IFoo < टी >' के लिए प्रकार 'MyNamespace.FooGetter' कनवर्ट नहीं कर सकता
कोई व्याख्या कर सकते हैं क्या sealed
कीवर्ड के संबंध में यहां हो रहा है? यह दृश्य स्टूडियो में एक .NET 4 परियोजना के खिलाफ # 4 सी है 2010
अद्यतन: काफी दिलचस्प है मैं व्यवहार के उस हिस्से पर ठोकर खाई जब मैं सोच रहा था क्यों निम्नलिखित कोड यह ठीक करता है जब sealed
लागू किया जाता है:
return (IFoo<T>)(IFoo<int>)new FooGetter();
अद्यतन: सिर्फ स्पष्टीकरण के लिए, यह सब ठीक चलता है जब T
के प्रकार का अनुरोध किया ठोस प्रकार के द्वारा प्रयोग किया T
के प्रकार के रूप में ही है। यदि प्रकार भिन्न होते हैं, कलाकारों की तरह कुछ के साथ कार्यावधि में विफल रहता है:
असमर्थप्रकार 'MyNamespace.StringFoo' की वस्तु कास्ट करने के लिए टाइप करने के लिए 'MyNamespace.IFoo`1 [System.Int32]'
उपरोक्त उदाहरण में, StringFoo : IFoo<string>
और कॉलर int
प्राप्त करने के लिए कहता है।
मैं इसका उत्तर नहीं है, लेकिन मैं कल्पना कर सकते हैं यह तथ्य यह है कि 'IFoo' एक खुला सामान्य प्रकार जबकि 'FooGetter' लागू करता है के साथ क्या करना है कि कुछ 'IFoo 'जो एक बंद सामान्य प्रकार है। –
बस एक नोट: मैंने सुनिश्चित किया कि मुझे प्रश्न पोस्ट करने से पहले व्यवहार परिभाषित किया गया है - मैं खुद को मूर्ख बनाना नहीं चाहता था :-) मैं देख सकता हूं कि इसकी अनुमति क्यों दी जा सकती है, संकलक यह गारंटी नहीं दे सकता कि क्या हो रहा है, यह केवल जानता है कि इसमें सफलता का मौका है। लेकिन किसी कारण से, यह सफलता का एक ही मौका हटा देता है जब मुहरबंद कीवर्ड मौजूद होता है क्योंकि यह माना जाता है कि क्योंकि इसे प्राप्त नहीं किया जा सकता है, यह टी से मेल नहीं खा सकता है। –
+1 दिलचस्प :) – leppie