为什么没有List <T>的构造函数采用params参数?

xof*_*ofz 6 c# collections params

我知道我可以使用集合初始化程序来初始化列表:

var list = new List<string>
{
    "test string 1",
    "test string 2"
};
Run Code Online (Sandbox Code Playgroud)

如果我记得,这内部为每个项目调用添加.

为什么没有一个构造函数List<T>需要params T[] items

var list = new List<string>("test string 1", "test string 2");
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 17

真正的原因是设计师根本不觉得这一小段语法糖的好处值得付出实施的努力,或者它可能会引起一些混乱.

如果你想创建一个,有一个小问题List<int>.这应该是什么意思?

var list = new List<int>(10);
Run Code Online (Sandbox Code Playgroud)

这是一个容量为10的新列表,还是包含单个元素的新列表,10?

Spoiler,如果您不确定编译器将如何解释它:

它将被视为一种能力.如果T不是int,它将被视为单个元素.如果您指定参数名称,它也将被视为单个项目 - List<int>(items:10)

无论如何,没有理由你不能写:

var list = new List<string>(new[] { "test string 1", "test string 2" });
Run Code Online (Sandbox Code Playgroud)

这也正是编译器会做什么,如果有曾经被认为提供了一个构造函数params参数,这确实略高于集合初始化更有效.必须输入一些额外的字符才能实现这一点,这对于宏伟的计划来说并不是什么大不了的事.


Mar*_*ell 8

...因为创建一个没有令人信服的案例?特别地,不存在,知道的方式params被用来作为params,而不是仅仅通过使string[]在,所以它不会能够相信该阵列为后盾阵列-所以这将是一个向量的额外和不必要的分配.并且集合初始化器语法非常好用.如果您希望以正确的大小分配,您可以始终使用:

var list = new List<string>(2)
{
    "test string 1",
    "test string 2"
};
Run Code Online (Sandbox Code Playgroud)

虽然坦率地说,重要的次数非常少.

实际上,我花了很多时间去除 params使用情况.在繁忙的站点上,它是非常痛苦的(当在热代码路径中使用时).