^ 运算符在 C# 8.0 和更高版本中提供,指示序列末尾的元素位置。
例如:
int[] xs = new[] { 0, 10, 20, 30, 40 };
int last = xs[^1];
Console.WriteLine(last); // output: 40
var lines = new List<string> { "one", "two", "three", "four" };
string prelast = lines[^2];
Console.WriteLine(prelast); // output: three
string word = "Twenty";
Index toFirst = ^word.Length;
char first = word[toFirst];
Console.WriteLine(first); // output: T
如前面的示例所示,表达式 ^e 属于 System.Index 类型。
在表达式 ^e 中,e 的结果必须隐式转换为 int。
还可以将 ^ 运算符与范围运算符一起使用以创建一个索引范围。
… 运算符在 C# 8.0 和更高版本中提供,指定索引范围的开头和末尾作为其操作数。
任一操作数都可以是序列开头或末尾的索引,如以下示例所示:
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int start = 1;
int amountToTake = 3;
int[] subset = numbers[start..(start + amountToTake)];
不包含 下标=4
Display(subset); // output: 10 20 30
int margin = 1;
int[] inner = numbers[margin..^margin];
//[ 下标1-4,不包含最后一个数字 => ^-1=下标5]
Display(inner); // output: 10 20 30 40
string line = "one two three";
int amountToTakeFromEnd = 5;
Range endIndices = ^amountToTakeFromEnd..^0;
string end = line[endIndices];
Console.WriteLine(end); // output: three
void Display<T>(IEnumerable<T> xs) => Console.WriteLine(string.Join(" ", xs));
如前面的示例所示,表达式 a…b 属于 System.Range 类型。 在表达式 a…b 中,a 和 b 的结果必须隐式转换为 int 或 Index。
可以省略 … 运算符的任何操作数来获取无限制范围:
a.. 等效于 a..^0
..b 等效于 0..b
.. 等效于 0..^0
int[] numbers = new[] { 0, 10, 20, 30, 40, 50 };
int amountToDrop = numbers.Length / 2;
int[] rightHalf = numbers[amountToDrop..];
Display(rightHalf); // output: 30 40 50
int[] leftHalf = numbers[..^amountToDrop];
Display(leftHalf); // output: 0 10 20
int[] all = numbers[..];
Display(all); // output: 0 10 20 30 40 50
void Display<T>(IEnumerable<T> xs) => Console.WriteLine(string.Join(" ", xs));
.、()、^ 和 … 运算符无法进行重载。 [] 运算符也被视为非可重载运算符。 使用索引器以支持对用户定义的类型编制索引。