次の方法で共有


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.

А теперь я предлагаю в комментариях оставлять шутки о Президенте Клинтоне.

Оригинал статьи