Targeting .net 4.0, sto cercando di costruire le seguenti classi:Fusioni non valido di tipo Constrained C# Generico
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;
}
}
}
Come il codice di commento indica sopra, il compilatore dà un errore:
Cannot implicitly convert type 'Shared.Configuration.ConfigurationElementCollection<TElement, TParent>' to 'Shared.Configuration.ConfigurationElementCollection<Shared.Configuration.ParentedConfigElement<TParent>,TParent>
Non mi aspetto questo errore, perché il compilatore sa anche che TElement
è un Shared.Configuration.ParentedConfigElement<TParent>
a causa del vincolo di tipo generico che ho specificato.
Eppure, ho dato io getterò esplicitamente il tipo per superare questo problema:
(ConfigurationElementCollection<ParentedConfigElement<TParent>,TParent>) this;
Purtroppo, ottengo lo stesso errore del compilatore. Perché sta succedendo? Che cosa ho fatto di sbagliato? E senza ricorrere ai tipi dynamic
, cosa posso fare per risolvere questo problema?
È odioso che il vincolo generico su CEC connota esattamente la stessa cosa dell'interfaccia che hai fornito ... e tuttavia il vincolo generico sembra essere ignorato. Tuttavia, sono molto felice che tu abbia trovato un modo per farlo funzionare senza usare un tipo 'dinamico '. –
Usare la composizione è molto meglio e il modo giusto per farlo :). Rimozione della mia risposta. –
Ma il vincolo generico non dice esattamente la stessa cosa dell'interfaccia, dice solo che il primo argomento di tipo eredita da "ParentedConfigElement". Ciò significa che 'TElement' è assegnabile a' ParentedConfigElement 'ma quell'ereditarietà non si estende ai parametri di tipo di tipi generici. –
Erik