मैंने निम्नलिखित वर्गों और विधियों को परिभाषित किया है:क्यों सी # जेनेरिक ओवरराइड तरीकों के लिए सही ढंग से बंधे नहीं है?
using System;
using System.Linq.Expressions;
using System.Windows.Forms;
public class ReturnValue<T, S> {}
public class Something<T>
{
// Sorry about the odd formatting. Trying to get it to fit nicely...
public ReturnValue<T, C>
Do<C, S>(C control, Expression<Func<C, S>> controlProperty)
where C : Control
{
return new ReturnValue<T, C>();
}
public ReturnValue<T, ToolStripItem>
Do<S>(ToolStripItem control, Expression<Func<ToolStripItem, S>> controlProperty)
{
return new ReturnValue<T, ToolStripItem>();
}
}
यह ठीक संकलित करता है। वू हू! आधे रास्ते वहाँ। फिर, मैं इसे बाद में कोड के साथ उपयोग करने का प्रयास करता हूं:
var toolStripItem = new ToolStripStatusLabel();
var something = new Something<string>();
something.Do(toolStripItem, t => t.Text); // Does not compile
हालांकि, यह निम्न त्रुटि संदेश के साथ मर जाता है
प्रकार
ToolStripStatusLabel
सामान्य प्रकार में टाइप पैरामीटरC
के रूप में उपयोग नहीं किया जा सकता है या विधिSomething<T>.Do<C,S>(C, Expression<Func<C,S>>)
। Xzx77 सेControl
तक कोई अंतर्निहित संदर्भ रूपांतरण नहीं है।
मुझे ऐसा लगता है कि सी # कंपाइलर इस मामले में विफल रहा है हालांकि दोनों विधियां संदिग्ध विधि घोषणाओं का एक सेट नहीं बनाती हैं। Control
और ToolStripStatusLabel
Component
के विरासत पेड़ में भाई बहन के रूप में मौजूद है। मुझे लगता है कि संकलक के पास क्लाइंट कोड में विधि आमंत्रण को सही ढंग से बाध्य करने के लिए पर्याप्त जानकारी होगी।
हालांकि, अगर मैं अपनी खुद की भाई कक्षाओं के साथ एक ही काम करता हूं, तो सबकुछ ठीक से संकलित होता है।
public class Parent {}
public class Child1 : Parent {}
public class Child2 : Parent {}
public class Something2<T>
{
public ReturnValue<T, C>
Do<C, S>(C control, Expression<Func<C, S>> controlProperty)
where C : Child1
{
return new ReturnValue<T, C>();
}
public ReturnValue<T, Child2>
Do<S>(Child2 control, Expression<Func<Child2, S>> controlProperty)
{
return new ReturnValue<T, Child2>();
}
}
var child2 = new Child2();
var something2 = new Something2<string>();
something2.Do(child2, c => c.GetType()); // Compiles just fine
क्या किसी ने कुछ गलत किया है, तो क्या कोई भी प्रकाश डाल सकता है?
जॉन, यह एक महान स्पष्टीकरण है। धन्यवाद। – realistschuckle
तो दूसरा उदाहरण संकलित क्यों करता है? –
ब्लूराजा (एक महान नाम के अलावा) सही ढंग से लिखता है, जिसे मैंने स्पष्टीकरण पर विचार करने के बाद सोचा था। कोई अंतर्दृष्टि, जॉन? – realistschuckle