Может кто-нибудь уточнить ключевое слово С# is
. В частности, эти два вопроса:
Q1) строка 5; Почему это верно?
Q2) строка 7; Почему исключение исключений?
public void Test()
{
object intArray = new int[] { -100, -200 };
if (intArray is uint[]) //why does this return true?
{
uint[] uintArray = (uint[])intArray; //why no class cast exception?
for (int x = 0; x < uintArray.Length; x++)
{
Console.Out.WriteLine(uintArray[x]);
}
}
}
Описание MSDN не уточняет ситуацию. Он утверждает, что is
вернет true, если выполнено одно из этих условий. (http://msdn.microsoft.com/en-us/library/scekt9xw(VS.71).aspx > MDSN Article)
expression is not null. expression can be cast to type.
Я не верю, что вы можете сделать действительный набор int [] в uint []. Потому что:
A) Этот код не компилируется:
int[] signed = new int[] { -100 };
uint[] unsigned = (uint[])signed;
B) Выполнение броска в отладчике дает ошибку:
(uint[])signed
"Cannot convert type 'int[]' to 'uint[]'"
Конечно, если строка 3 была int [] вместо объекта, тогда она никогда не будет компилироваться. Это подводит меня к окончательному вопросу, связанному с Q2.
Q3) Почему С# поднимает ошибку литья/преобразования в отладчике и компиляторе, но не во время выполнения?