[英]Why wouldn't C# support generics of generics (generics with parameterized types)?
最近(可能是設計缺點)當我需要有一個MyType<T>
的集合時,我面臨一個常規任務,其中T
不是固定的(即整個集合中有多個不同的泛型實例)。
由於它被廣泛提出(對於這種情況),宣布了一個抽象類:
public abstract class MyType {}
public class MyType<T>: MyType {}
然后我有一個MyType
的集合。 然而,對於這個集合,我有一個約束,對於任何類型T
只有一個元素。
因此,我做了一些ICollection<TBase>
的自定義實現。 我想在其中包含一個Get<TParam>()
用於獲取與TParam
類型對應的項目。 以后用作:
MyCollection<MyType> collection = new MyCollection<MyType>();
MyType<int> myInt = collection.Get<int>();
但是我意外地發現我甚至無法宣布它:
public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } //this won't compile
因為內部泛型(或所謂的“泛型泛型”)既不支持C#也不支持.NET(我想)。 您如何看待這些限制背后是否存在任何具體原因(復雜性除外)?
更新1.詢問編譯器版本和編譯器錯誤。
Microsoft C#,.NET 3.5(Visual Studio 2010)。 錯誤:
錯誤CS0081:類型參數聲明必須是標識符而不是類型
錯誤CS0246:找不到類型或命名空間名稱“TCustom”(您是否缺少using指令或程序集引用?)
更新2.被問及我是否需要修復或解釋原因。 我真的想知道為什么 。 但如果你有解決問題的好方法,也歡迎你。
在這種情況下,您可以簡單地將數據隱藏在非泛型字典中:
private Dictionary<Type, object> _Data;
然后你的Get
方法:
public MyType<TParam> Get<TParam>()
{
return (MyType<TParam>)_Data[typeof(TParam)];
}
如果TParam
類型不相關,那么沒有通用的數據結構可以為您提供類型安全,那么為什么要嘗試呢?
為什么你需要
public TCustom<TParam> Get<TParam, TCustom<TParam>>() { }
當通用類型(在您的情況下為MyType)已知時,您不能這樣做
public MyType<TParam> Get<TParam>() {
return (MyType<TParam>)_items.FirstOrDefault(i => i is MyType<TParam>);
}
或者我錯過了什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.