8

为什么"my,string".Split(',')在 .NET C# 中工作?

根据 MSDN,Split 的声明是Split(Char[]). MSDN String.Split 方法

我认为 C# 5 将单个 char 转换','char[] {','}; 但我一定是错的,因为以下代码不起作用:

static void Main()
{
    GetChar(',');
}

static char GetChar(char[] input)
{
    return input[0];
}

编辑:感谢 Jon Skeet 的回答,我将论点更改为params char[],它证明了这个概念。

static char GetChar(params char[] input)
{
    return input[0];
}
4

2 回答 2

23

您使用的重载基本上使用参数数组。这就是params部分。编译器会自动将您的单个参数包装到一个数组中。所以这:

var x = text.Split(',');

相当于:

var x = text.Split(new char[] { ',' });

您也可以将参数数组用于您自己的方法,使用以下params关键字:

static char GetChar(params char[] input)
{
    return input[0];
}

请注意,参数数组必须是最终参数。这就是为什么您使用的重载是使用参数数组的唯一重载。Split查看其他重载:

Split(Char[], Int32)
Split(Char[], StringSplitOptions)
Split(String[], StringSplitOptions)
Split(Char[], Int32, StringSplitOptions)
Split(String[], Int32, StringSplitOptions)

在每种情况下,数组都是第一个参数,因此您必须自己构造一个数组:

var x = text.Split(new char[] { ',' }, 10); // Call the (char[], int) overload

或使用隐式类型数组:

var x = text.Split(new[] { ',' }, 10); // Call the (char[], int) overload
于 2013-07-29T20:55:45.253 回答
5

实际调用的重载是this。请注意,页面顶部的标题具有误导性,它实际上params char[]取而代之的是char[]. 这允许您传递分隔符,"my, string".Split(',', ' ')而不是让您跳过"my, string".Split(new char[] { ',', ' ' })首先使用的箍。

于 2013-07-29T20:56:31.193 回答