在C#中使用"params"关键字表示通用参数

Geo*_*ell 49 c# generics

Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>今天在C#.NET 4.5中遇到了这位美丽的代表.我假设16是一个任意停止的地方(哪些方法有超过16个参数?)但它让我思考:在C#中是否可以指定泛型类型可以有任意数量的类型参数?类似于方法的params关键字允许方法的任意数量的参数.像这样的东西:

public class MyInfiniteGenericType<params T[]> { ... }
Run Code Online (Sandbox Code Playgroud)

然后,在类中,您可以通过枚举它们或使用允许在方法中使用T[index]的相同方式来访问类型参数params.

我个人从来没有使用它,但Func代表将是一个使用它的完美场所.不需要16种不同类型的Func!

所以我的问题是,这可以在C#中以任何方式完成,如果不是,这是一个愚蠢的想法吗?

Jon*_*eet 47

是否可以在C#中指定泛型类型可以包含任意数量的类型参数?

不,C#没有我喜欢的东西.

从根本上说Func<T>Func<T1, T2>是尽可能的CLR而言完全无关的类型,而且也没有像params指定多个类型参数.

至于它的实用性:我可以看到它可能有用的情况,但我怀疑它们很少见,意味着该功能没有超过"利益/成本"门槛.(请注意,它几乎肯定也需要CLR更改.)

  • @rushonerok:将它放入框架的成本非常低,虽然它不会被*manual*代码使用,但它用于动态类型.更改语言以支持此功能请求的成本要高得多. (4认同)
  • 我今天遇到了这个案子,并且正在寻找是否有可能.我不相信因为成本/收益而应该省略这样的事情.我的意思是16种通用类型的方法很难看......而且我愿意打赌几乎没有人使用它,因此将它加入框架所花费的时间是浪费. (2认同)

sbl*_*lom 9

C++ 11具有您正在谈论的功能.他们称之为可变参数模板.

但是,C#泛型并不像C++模板那样,并且很难构建完全相同的东西.

在C++的情况下,模板在编译时扩展为使用的任何具体类型.在C#案例中,类型规范完全在运行时发生.由此产生的IL需要支持遇到的不同类型的数量.