I donβt think you need to worry about the possible performance impact due to conversion. Just look at the machine code generated by the JIT, they are identical for the int and long index:
x86, release mode, int index:
var val = arr[idx]; 00000059 cmp ebx,dword ptr [edx+4] 0000005c jae 00000078 0000005e mov esi,dword ptr [edx+ebx*4+8]
x86, release mode, cast long index:
var val = arr[(int)idx]; 0000005f cmp ebx,dword ptr [edx+4] 00000062 jae 00000081 00000064 mov esi,dword ptr [edx+ebx*4+8]
x64, release mode, int index:
var val = arr[idx]; 00000060 movsxd rcx,ebx 00000063 mov rax,qword ptr [rdi+8] 00000067 cmp rcx,3 0000006b jae 0000000000000080 0000006d mov ecx,dword ptr [rdi+rcx*4+10h]
x64, release mode, long index:
var val = arr[(int)idx]; 00000061 movsxd rcx,ebx 00000064 mov rax,qword ptr [rdi+8] 00000068 cmp rcx,3 0000006c jae 0000000000000080 0000006e mov ecx,dword ptr [rdi+rcx*4+10h]
As Daniel Gehriger noted, the conv.i4 IL instruction should not be counted in machine code, 32 MSBs are simply discarded.