1) В соответствии с моей книгой, is
оператор может проверить, является ли выражение E
(E is type
) может быть преобразован в целевой тип, только если E
является либо ссылочное преобразование, бокс или распаковка. Так как в следующем примере is
не проверяет ни для одного из трех типов преобразования, код не должен работать, но это делает:«является» оператор ведет себя немного странно
long l; // EDIT - I forgot to add this line of code in my initial post
int i=100;
if (i is long) //EDIT - in my initial post I've claimed condition returns true, but it really returns false
l = i;
2)
а)
B b;
A a = new A();
if (a is B)
b = (B)a;
int i = b.l;
class A { public int l = 100; }
class B:A { }
Приведенный выше код всегда вызывает ошибку времени компиляции “Use of unassigned variable”
. Если условие a is B
оценивается как false
, то b
не будет присвоено значение, но при условии true
, то это будет. И таким образом, разрешив такой компилятор кода, не будет знать, является ли использование b
в коде, следующем за оператором if
, действительным или нет (из-за того, что не знает, a is b
оценивает true
или false
), но зачем ему это знать? Intsead, почему это невозможно?
b) Но если вместо этого мы имеем дело с не ссылочными типами, то компилятор не жалуется, хотя код идентичен. Почему?
int i = 100;
long l;
if (i is long)
l = i;
спасибо
Лично я удивлен, что '(i long) == true'. Однако поведение (2) совершенно прямолинейно. –
BTW, C# чувствителен к регистру. Нет оператора 'IS'. –
@JS Bangs - простой: это не так. –