你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

项访问

Q# 支持对数组项和用户定义类型中的项的项访问。 在这两种情况下,访问都是只读的,如果不使用复制和更新表达式创建新实例,则无法更改值。

数组项访问和数组切片

给定一个数组表达式和一个 IntRange 类型的表达式,可以使用由 [] 组成的数组项访问运算符形成一个新的表达式。

如果括号内的表达式是 Int 类型,那么新的表达式包含该索引处的数组项。 例如,如果 arrDouble[] 类型并且包含五个或更多项,则 arr[4]Double 类型的表达式。

如果括号内的表达式是 Range 类型,则新表达式包含由指定的 Range 编制索引的所有项的数组。 如果 Range 为空,则生成的数组为空。 例如,应用于对象的

let arr = [10, 11, 36, 49];
let ten = arr[0]; // contains the value 10
let odds = arr[1..2..4]; // contains the value [11, 49]
let reverse = arr[...-1...]; // contains the value [49, 36, 11, 10]

在示例的最后一行,为方便起见,省略了范围的开始值和结束值。 有关详细信息,请参阅上下文表达式

如果数组表达式不是简单标识符,则必须将其括在括号中才能提取项或切片。 例如,如果 arr1arr2 都是整数数组,则串联中的项将表示为 (arr1 + arr2)[13]。 有关详细信息,请参阅优先级和关联性

Q# 中的所有数组都是从零开始的,即数组 arr 的第一个元素始终是 arr[0]。 如果用于切片的索引或索引之一超出数组的边界,例如如果它小于零或大于或等于数组的长度,则会在运行时引发异常。

用户定义类型的项访问

(如需详细了解如何定义包含一个或多个命名项或匿名项的自定义类型,请参阅类型声明)。

可以通过其名称或解构来访问包含的项,这些语句可能用作操作或函数实现的一部分:

    let complex = Complex(1., 0.); // create a value of type Complex
    let (re, _) = complex!;       // item access via deconstruction
    let im = complex::Imaginary;  // item access via name

项访问运算符 (::) 检索命名项,如以下示例所示:

newtype TwoStrings = (str1 : String, str2 : String);

operation LinkTwoStrings(str : TwoStrings) : String {
    let s1 = str::str1;
    let s2 = str::str2;
    return s1 + s2;
}

虽然可以通过名称或析构来访问命名项,但匿名项只能通过析构访问。 由于析构依赖于所有包含的项,因此当需要在定义类型的编译单元之外访问这些项时,不建议使用匿名项。

通过析构访问使用了 unwrap 运算符 (!)。 unwrap 运算符会返回所有包含的项的元组,其中元组的形状与声明中定义的形状相匹配,并且单个项元组等同于项本身(请参阅本部分)。

例如,对于 Nested 类型的值 nested,定义如下

newtype Nested = (Double, (ItemName : Int, String));

表达式 nested! 返回一个 (Double, (Int, String)) 类型的值。

! 运算符的优先级低于两个项访问运算符,但高于任何其他运算符。 有关优先级的完整列表,请参阅优先级和关联性