、私は以下のクラスを構築しようとしている:無効なキャスト
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;
}
}
}
上記のコードのコメントが示すように、コンパイラはエラーを与える:
Cannot implicitly convert type 'Shared.Configuration.ConfigurationElementCollection<TElement, TParent>' to 'Shared.Configuration.ConfigurationElementCollection<Shared.Configuration.ParentedConfigElement<TParent>,TParent>
私が指定したジェネリック型の制約のため、TElement
がShared.Configuration.ParentedConfigElement<TParent>
であることもコンパイラーが知っているため、このエラーは予想されません。
はそれでも、私は明示この問題を乗り越えるためにタイプをキャストします図:
(ConfigurationElementCollection<ParentedConfigElement<TParent>,TParent>) this;
は残念ながら、私は同じコンパイラエラーを取得します。なぜこうなった?私は何を間違えたのですか? dynamic
タイプに頼らなくても、これを修正するにはどうすればよいですか?
CECのジェネリック制約は、提供したインターフェイスとまったく同じことを暗黙に指摘していますが、一般的な制約は無視されているように感じられます。それでも、「ダイナミック」タイプを使用せずにこの作業を行う方法を見つけて本当に嬉しく思っています。 –
これを行うには、組成を使用する方がはるかに優れています。私の答えを取り除く。 –
しかし、ジェネリック制約はインターフェイスとまったく同じことを言っていませんが、最初の型引数は 'ParentedConfigElement'から継承しているだけです。つまり、 'TElement'は' ParentedConfigElement 'に代入可能ですが、その継承はジェネリック型の型パラメータに拡張されません。 –
Erik