只是一個想法。C#5.0中可選的泛型類型參數呢?
在C#中有可選的類型參數是否有用?
這會讓生活變得更簡單。我厭倦了有多個具有相同名稱的類,但具有不同的類型參數。另外VS不支持這個非常貝爾(文件名):-)
這例如消除需要一個非通用的IEnumerable:
interface IEnumerable<out T=object>{
IEnumerator<T> GetEnumerator()
}
你覺得呢?
只是一個想法。C#5.0中可選的泛型類型參數呢?
在C#中有可選的類型參數是否有用?
這會讓生活變得更簡單。我厭倦了有多個具有相同名稱的類,但具有不同的類型參數。另外VS不支持這個非常貝爾(文件名):-)
這例如消除需要一個非通用的IEnumerable:
interface IEnumerable<out T=object>{
IEnumerator<T> GetEnumerator()
}
你覺得呢?
我絕對是爲了它。
我目前正在爲不同場景編寫助手方法,我希望將引用傳遞給不同的成員和方法的類。爲了達到這個目的,我將例如一個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)
在我而言,它會避免很多重複的代碼...
該語言功能的主要用途是什麼?我可以看到它可以幫助執行一些管理任務,比如文件名和較少的輸入等,但除此之外,我不認爲這將會是多麼有用。
另外,這個特性會明顯複雜化泛型約束,而泛型約束可以放在泛型類型參數上,而默認類型本身必須作爲一種通用約束本身。
我認爲這會使語言複雜化,而不會給開發者帶來任何實際的好處。
它會保持類型hiearchies更清潔。給定一個
默認類型會受到種種束縛因此後續代碼可以保持無知。它基本上使IEnumerable與IEnumerable
我不清楚你到底在建議什麼。目前可能存在具有相同名稱但不同類型參數的類型,但這些類型與繼承無關 - 您的提案會做什麼?此外,如果基礎類庫從頭開始重新設計,那麼幾乎肯定不會有非泛型的IEnumerable接口 - 它只存在是因爲在引入接口時CLR不支持泛型,而泛型接口僅從它繼承,以便遺留代碼將繼續工作。爲支持泛型的CLR正在創建新聲明的類,因此問題不再相關。
我最近遇到一個案例,可能使用過這樣的事情,只是不完全。我有一個方法在類A和它相關的類AChild和類B和類BChild之間執行各種類型的轉換。通常,A/AChild對與B/BChild相同,但有時A是B的基類,AChild是BChild的基類。
如果能夠說我的類型參數TB默認爲TA,並且TBChild默認爲TAChild,那本來是很不錯的。
請注意,這是一個需要寫出類型參數的情況,因爲推理不起作用。
在你的榜樣,你會如何區分'IEnumerable
typeof(IEnumerable
標準解決方案圍繞這裏的文件名問題,我認爲VS團隊認可的標準解決方案儘管此刻我無法找到鏈接),但要將文件保存爲AGenericType,並使用像AGenericType'4.cs這樣的名稱。 –
2010-04-09 23:44:17