2010-03-29 71 views
8

只是一個想法。C#5.0中可選的泛型類型參數呢?

在C#中有可選的類型參數是否有用?

這會讓生活變得更簡單。我厭倦了有多個具有相同名稱的類,但具有不同的類型參數。另外VS不支持這個非常貝爾(文件名):-)

這例如消除需要一個非通用的IEnumerable:

interface IEnumerable<out T=object>{ 
    IEnumerator<T> GetEnumerator() 
} 

你覺得呢?

+0

在你的榜樣,你會如何區分'IEnumerable '和'IEnumerable'?第一個是IEnumerable <>'? – 2010-03-29 22:29:01

+0

typeof(IEnumerable )== typeof(IEnumerable)== typeof(IEnumerable <>)。MakeGenericOrSo(typeof(object)) – 2010-03-29 22:35:36

+0

標準解決方案圍繞這裏的文件名問題,我認爲VS團隊認可的標準解決方案儘管此刻我無法找到鏈接),但要將文件保存爲AGenericType ,並使用像AGenericType'4.cs這樣的名稱。 – 2010-04-09 23:44:17

回答

3

我絕對是爲了它。

我目前正在爲不同場景編寫助手方法,我希望將引用傳遞給不同的成員和方法的類。爲了達到這個目的,我將例如一個Expression<Func<TIn, TOut>>作爲幫助器的參數(這可以讓我用lambda表達式訪問方法,從而保持所有的強類型)。

但 - 我目前需要爲每個不同數量的輸入參數定義一個新的幫助器方法,因爲我需要對它有不同數量的通用參數。取而代之的

HelperMethod<TIn>(Expression<Action<TIn>> arg) // Yes, C# can distinguish 
HelperMethod<TOut>(Expression<Func<TOut>> arg) // these two from eachother 
HelperMethod<TIn, TOut>(Expression<Func<TIn, TOut>> arg) 
HelperMethod<TIn1, TIn2, TOut>(Expression<Func<TIn1, TIn2, TOut>> arg) 
// etc 

我能有做的,頂多兩個方法:

HelperMethod<TIn>(Expression<Action<TIn>> arg) 
HelperMethod<TOut, TIn1 = DummyType, ...>(Expression<Func<TIn1, ..., TOut> arg) 

在我而言,它會避免很多重複的代碼...

2

該語言功能的主要用途是什麼?我可以看到它可以幫助執行一些管理任務,比如文件名和較少的輸入等,但除此之外,我不認爲這將會是多麼有用。

另外,這個特性會明顯複雜化泛型約束,而泛型約束可以放在泛型類型參數上,而默認類型本身必須作爲一種通用約束本身。

我認爲這會使語言複雜化,而不會給開發者帶來任何實際的好處。

+1

它會保持類型hiearchies更清潔。給定一個和B :一個,B:A將來自同一個類型派生爲B 2010-03-29 23:01:44

+0

默認類型會受到種種束縛因此後續代碼可以保持無知。它基本上使IEnumerable與IEnumerable 一樣(例如,該功能的實際用處包含更復雜的體系結構) – 2010-12-22 14:53:54

0

我不清楚你到底在建議什麼。目前可能存在具有相同名稱但不同類型參數的類型,但這些類型與繼承無關 - 您的提案會做什麼?此外,如果基礎類庫從頭開始重新設計,那麼幾乎肯定不會有非泛型的IEnumerable接口 - 它只存在是因爲在引入接口時CLR不支持泛型,而泛型接口僅從它繼承,以便遺留代碼將繼續工作。爲支持泛型的CLR正在創建新聲明的類,因此問題不再相關。

0

我最近遇到一個案例,可能使用過這樣的事情,只是不完全。我有一個方法在類A和它相關的類AChild和類B和類BChild之間執行各種類型的轉換。通常,A/AChild對與B/BChild相同,但有時A是B的基類,AChild是BChild的基類。

如果能夠說我的類型參數TB默認爲TA,並且TBChild默認爲TAChild,那本來是很不錯的。

請注意,這是一個需要寫出類型參數的情況,因爲推理不起作用。