Targeting .net 4.0 Ich versuche, die folgenden Klassen zu bauen:Ungültige Cast von Typ Constrained C# Generisches
public class ConfigurationElementCollection<TElement, TParent>
where TElement : ParentedConfigElement<TParent>, new()
where TParent : class
{
public TParent ParentElement { get; set; }
protected ConfigurationElement CreateNewElement()
{
//**************************************************
//COMPILER GIVES TYPE CONVERSION ERROR ON THIS LINE!
//**************************************************
return new TElement { ParentCollection = this };
}
}
public class ParentedConfigElement<TParent> : ConfigurationElement where TParent : class
{
internal ConfigurationElementCollection<ParentedConfigElement<TParent>, TParent>
ParentCollection { get; set; }
protected TParent Parent
{
get
{
return ParentCollection != null ? ParentCollection.ParentElement : null;
}
}
}
Da der Code Kommentar oben zeigt, gibt der Compiler einen Fehler:
Cannot implicitly convert type 'Shared.Configuration.ConfigurationElementCollection<TElement, TParent>' to 'Shared.Configuration.ConfigurationElementCollection<Shared.Configuration.ParentedConfigElement<TParent>,TParent>
Ich erwarte diesen Fehler nicht, weil der Compiler auch weiß, dass TElement
ein Shared.Configuration.ParentedConfigElement<TParent>
aufgrund der generischen Typ Einschränkung ich angegeben wurde.
Dennoch Ich denke, ich werde ausdrücklich die Art werfen Vergangenheit dieses Problem zu erhalten:
(ConfigurationElementCollection<ParentedConfigElement<TParent>,TParent>) this;
Leider bekomme ich den gleichen Compiler-Fehler. Warum passiert dies? Was habe ich falsch gemacht? Und ohne auf dynamic
Arten zurückgreifen, was kann ich tun, um das zu beheben?
Es ist anstößig, dass die generische Einschränkung für CEC genau dasselbe bedeutet wie die von Ihnen bereitgestellte Schnittstelle ... und doch fühlt sich die generische Einschränkung so an, als würde sie ignoriert. Trotzdem bin ich sehr froh, dass Sie einen Weg gefunden haben, dies ohne einen 'dynamischen' Typ zu machen. –
Die Verwendung von Komposition ist viel besser und der richtige Weg, dies zu tun :). Entferne meine Antwort. –
Aber die generische Constraint sagt nicht genau dasselbe wie die Schnittstelle, es sagt nur, dass der erste Typ Argument von ParenedConfigElement erbt. Dies bedeutet, dass "TElement" zu "ParentedConfigElement " zuweisbar ist, aber diese Vererbung erstreckt sich nicht auf die Typparameter generischer Typen. –
Erik