There is no cast between a string and an int. The "as" operator will return null if a cast is invalid. This operator is really syntactic sugar for
Code:
o is string ? (string)o : (string)null
Of course "o is string" is never true in your case, so it will always return null.
If you try to use (string)o when o is not a string, you'll get an invalid cast exception.
You should instead use i.ToString() to get the value as a string.