那么C#5.0中的可选泛型类型参数呢?

时间:2010-03-29 22:25:46

标签: c# generics

只是一个想法。

在C#中使用可选类型参数不是很有用吗?

这会让生活更简单。我厌倦了多个具有相同名称但类型参数不同的类。此外,VS不支持这个版本(文件名): - )

这将消除对非通用IEnumerable的需求:

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

您怎么看?

4 个答案:

答案 0 :(得分: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)

在我的情况下,它会避免大量的代码重复...

答案 1 :(得分:2)

此语言功能的主要用途是什么?我可以看到,它可以帮助一些管理任务,如文件名和更少的打字等,但除此之外我不认为这将是多么有用。

此外,此功能会使可能放在泛型类型参数上的任何通用约束变得非常复杂,默认类型本身必须作为一种通用约束本身。

我认为这会使语言复杂化而不会给开发者带来任何实际好处。

答案 2 :(得分:0)

我不清楚你究竟在提议什么。目前可能存在具有相同名称但类型参数不同的类型,但这些类型与继承无关 - 您的提案会做什么呢?

此外,如果基类库是从头开始重新设计的,那么几乎肯定不会有非通用的IEnumerable接口 - 它只存在,因为CLR在引入接口时不支持泛型,并且通用接口继承它只是为了遗留代码将继续工作。正在为支持泛型的CLR创建新声明的类,因此该问题不再相关。

答案 3 :(得分:0)

我最近遇到过一个案例,可能会使用类似的东西,但并不完全。我有一个方法,在类A及其关联的类AChild和类B和类BChild之间执行各种类型的转换。通常,A / AChild对与B / BChild相同,但有时A是B的基类,AChild是BChild的基类。

能够说我的类型参数TB默认为TA,并且TBChild默认为TAChild会很好。

请注意,这是一种必须写出类型参数的情况,因为推理不起作用。