Ekspresi kontekstual dan dihilangkan

Ekspresi kontekstual adalah ekspresi yang hanya valid dalam konteks tertentu, seperti penggunaan nama item dalam ekspresi salin dan perbarui tanpa harus memenuhi syarat.

Ekspresi dapat dihilangkan ketika dapat disimpulkan dan secara otomatis disisipkan oleh pengkompilasi, misalnya, dalam kasus pernyataan evaluate-and-reassign.

Rentang terbuka adalah contoh lain yang berlaku untuk ekspresi kontekstual dan dihilangkan. Mereka hanya valid dalam konteks tertentu, dan pengkompilasi menerjemahkannya ke dalam ekspresi normal Range selama kompilasi dengan menyimpulkan batas yang sesuai.

Nilai jenis Range menghasilkan urutan bilangan bulat, yang ditentukan oleh nilai awal, nilai langkah (opsional), dan nilai akhir. Misalnya, Range ekspresi 1..3 harfiah menghasilkan urutan 1,2,3. Demikian juga, ekspresi 3..-1..1 menghasilkan urutan 3,2,1. Anda juga dapat menggunakan rentang untuk membuat array baru dari array yang sudah ada dengan mengiris, misalnya:

    let arr = [1,2,3,4];
    let slice1 = arr[1..2..4];  // contains [2,4] 
    let slice2 = arr[2..-1..0]; // contains [3,2,1]

Anda tidak dapat menentukan rentang tak terbatas di Q#; nilai awal dan akhir selalu perlu ditentukan. Satu-satunya pengecualian adalah ketika Anda menggunakan Range untuk menggoreng array. Dalam hal ini, nilai awal atau akhir rentang dapat disimpulkan secara wajar oleh pengkompilasi.

Dalam contoh pemotongan array sebelumnya, wajar bagi pengkompilasi untuk mengasumsikan bahwa akhir rentang yang dimaksudkan harus menjadi indeks item terakhir dalam array jika ukuran langkah positif. Jika ukuran langkah negatif, maka rentang kemungkinan harus menjadi indeks item pertama dalam array, 0. Konverse menahan untuk awal rentang.

Untuk meringkas, jika Anda menghilangkan nilai mulai rentang, nilai mulai yang disimpulkan

  • nol jika tidak ada langkah yang ditentukan atau langkah yang ditentukan positif.
  • adalah panjang array dikurangi satu jika langkah yang ditentukan negatif.

Jika Anda menghilangkan nilai akhir rentang, nilai akhir yang disimpulkan

  • adalah panjang array dikurangi satu jika tidak ada langkah yang ditentukan atau langkah yang ditentukan positif.
  • nilainya akan nol jika langkah yang ditentukan negatif.

Q# oleh karena itu memungkinkan penggunaan rentang terbuka dalam ekspresi pemotongan array, misalnya:

let arr = [1,2,3,4,5,6];
let slice1  = arr[3...];      // slice1 is [4,5,6];
let slice2  = arr[0..2...];   // slice2 is [1,3,5];
let slice3  = arr[...2];      // slice3 is [1,2,3];
let slice4  = arr[...2..3];   // slice4 is [1,3];
let slice5  = arr[...2...];   // slice5 is [1,3,5];
let slice7  = arr[4..-2...];  // slice7 is [5,3,1];
let slice8  = arr[...-1..3];  // slice8 is [6,5,4];
let slice9  = arr[...-1...];  // slice9 is [6,5,4,3,2,1];
let slice10 = arr[...];       // slice10 is [1,2,3,4,5,6];

Karena penentuan apakah langkah rentang positif atau negatif terjadi pada runtime, pengkompilasi menyisipkan ekspresi yang sesuai yang akan dievaluasi saat runtime. Untuk nilai akhir yang dihilangkan, ekspresi yang disisipkan adalah step < 0 ? 0 | Length(arr)-1, dan untuk nilai awal yang dihilangkan, step < 0 ? Length(arr)-1 | 0, di mana step adalah ekspresi yang diberikan untuk langkah rentang, atau 1, jika tidak ada langkah yang ditentukan.