is это as или as это is?
Сегодняшний вопрос относится к операторам is и as: является ли оператор is всего лишь синтаксическим сахаром над оператором as, или наоборот, оператор as, реализован как синтаксический сахар над оператором is? Или кратко, оператор is – это as или is?
Возможно, пример кода будет более понятным. Можно ли следующий фрагмент кода
bool b = x is Foo;
рассматривать как синтаксический сахар для
bool b = (x as Foo) != null;
В таком случае оператор is является синтаксическим сахаром для оператора as. Аналогично, можно ли рассматривать
Foo f = x as Foo;
как синтаксический сахар для
var temp = x;
Foo f = (temp is Foo) ? (Foo)temp : (Foo)null;
в таком случае, оператор as является синтаксическим сахаром для оператора is. Очевидно, что оба оператора не могут быть всего лишь сахаром над другом, поскольку в этом случае мы получим бесконечную регрессию!
Спецификация языка очень четко говорит по этому поводу: оператор as (для не-dynamic типов) определен как синтаксический сахар для оператора is.
Однако на практике, CLR содержит инструкцию isinst, которая по иронию судьбы ведет себя как оператор as. Таким образом, у нас есть инструкция, которая замечательно реализует семантику оператора as, на основе которой мы можем создать реализацию оператора is. Короче говоря, де юре, оператор is – это is, а as – это is, но де факто, is – это as, а as – это isinst.
А теперь я предлагаю в комментариях оставлять шутки о Президенте Клинтоне.