考慮下面的類:類和方法層面的泛型類型約束作用
public class DerivedClassPool<TBase> where TBase : class
{
public TBase Get(Type componentType)
{
// Not important, but you get the idea
return Activator.CreateInstance(componentType) as TBase;
}
public TDerived SomeMethod<TDerived>() where TDerived : TBase
{
return Get(typeof(TBase)) as TDerived;
}
}
注意我已經限制了TBase
泛型類的說法應是一個類:where TBase : class
我也制約了TDerived
通用方法的參數是TBase
或從中衍生出來的東西:where TDerived : TBase
。
我上as TDerived
行錯誤:
類型參數「TDerived」不能使用的「爲」經營者,因爲它沒有一個類類型約束,也不是一個「類」約束
我明白,爲了防止我需要添加約束class
的錯誤,所以我會得到:
where TDerived : class, TBase
爲什麼我必須這樣做,當TBase
已被限制爲一個類和TDerived
被約束爲TBase
或從它派生?
請參閱http://stackoverflow.com/questions/8002148/c-sharp-generics-contraints-propagation。埃裏克把它放在那裏。 – 2012-01-17 16:56:19
@Jason,我認爲用'but'讀得更好。 – Joey 2012-01-17 16:57:20
@Joey:夠公平的。我只是討厭以'but'開頭的句子,儘管現在使用連詞開始的句子被認爲是正確的。我責怪我的高中英語老師。他是經典英語慣例的守護者。 – 2012-01-17 17:40:52