something to mention for answering:
Don\'t worry about variance, while the item in question is Array rather than
a as IList is (basically) casting. So just cast it first:
char[] a = (char[])Array.CreateInstance(typeof(char), 1);
a[0] = 'a';
Edit: the reason is: because the interface for Array simply doesn't define an indexer. It uses SetValue(Object, Int32) and Object GetValue(Int32). Notice the ominous Object stuff in there. Array isn't type specific; it's built for the lowest common denominator: Object. It could have just as easily defined an indexer, but in practice you'd still have the un/boxing problem.