簡體   English   中英

為什么C#不支持泛型泛型(帶參數化類型的泛型)?

[英]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.被問及我是否需要修復或解釋原因。 我真的想知道為什么 但如果你有解決問題的好方法,也歡迎你。

更新3. 此博客文章中可能已經回答了這個問題。 似乎CLR團隊面臨着不要過度復雜化語言的巨大壓力。

在這種情況下,您可以簡單地將數據隱藏在非泛型字典中:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM