Подтвердить что ты не робот

С# Language Design: группа методов внутри оператора `is`

Мне интересны некоторые варианты дизайна языка С#. В спецификации С# существует правило, позволяющее использовать группы методов в качестве выражений оператора is:

class Foo {
  static void Main() { if (Main is Foo) Main(); }
}

Условие выше всегда неверно, поскольку в спецификации указано:

7.10.10 Оператор

• Если E является группой методов или нулевым литералом, если тип E является ссылочным типом или нулевым типом, а значение E равно null, результат будет ложным.

Мои вопросы:. Какова цель/точка/причина, позволяющая использовать элемент языка С# без представления во время выполнения в группах CLR, подобных методам внутри такого "рабочего времени", например, is?

4b9b3361

Ответ 1

Какова цель/точка/причина, позволяющая использовать элемент языка С# без представления во время выполнения в группах CLR, подобных методам внутри такого "рабочего времени", например:?

В архиве заметок на языке не упоминается, почему было принято это решение, поэтому любая догадка в ответе будет гипотезой. Они упоминают, что если результат "есть" может быть статически определен, чтобы всегда быть истинным или ложным, чтобы он был так определен и выдавал предупреждение. Кажется правдоподобным, что это может быть просто ошибкой.

Наиболее распространенной причиной поворота того, что может быть ошибкой в ​​предупреждении (или просто разрешении), является то, что это уменьшает нагрузку на производителей программ, которые автоматически генерируют код. Однако я не вижу здесь действительно убедительного сценария.

ОБНОВЛЕНИЕ:

Я просто проверил спецификацию С# 1.0. В нем нет этого языка. Он ничего не говорит о аргументах нулей или групп методов. И, конечно же, он ничего не говорит о преобразованиях групп методов, потому что в С# 1.0 не было неявных преобразований группы методов; вам пришлось явно называть "новый D (M)", если вы хотите преобразовать метод M для делегирования типа D.

Эта последняя точка является оправданием для "M is D" , возвращающего false, а не true; Вы не могли законно сказать "D d = M"; поэтому почему "M is D" истинно?

Конечно, в С# 2.0 это имеет меньшее значение, поскольку вы можете сказать "D d = M"; в С# 2.0.

Я также просто спросил одного из присутствующих людей, когда был разработан оператор "есть" , и он не помнил, чтобы когда-либо решал этот вопрос так или иначе. Его подозрение заключалось в том, что первоначальный дизайн оператора "есть" заключался в том, чтобы не давать никаких ошибок, только предупреждений и что весь текст в спецификации о том, что делать с группами методов и нулями, а также о том, что было добавлено после штока, для С# 2.0 версии спецификации и на основе того, что сделал на самом деле компилятор.

Короче говоря, похоже, что это была дыра в С# 1.0, которая была напечатана, когда спецификация была обновлена ​​для С# 2.0. Это не похоже на то, что это конкретное поведение было желательным и сознательно реализовано.

Эта теория подкрепляется тем фактом, что анонимные методы вызывают ошибку при использовании в качестве аргумента для "is" в С# 2.0. Это не было бы преломлением для этого, но это было бы потрясающим изменением, чтобы заставить "M is D" внезапно начать возвращать true или быть ошибкой.

ДАЛЬНЕЙШЕЕ ОБНОВЛЕНИЕ:

Изучая это, я узнал что-то интересное. (Для меня.) Когда функция была изначально разработана, дизайн должен был либоменовать тип, либо объект Type, как правый аргумент "is". Эта идея была оставлена ​​задолго до того, как С# 1.0 отправлен.

Ответ 2

Прежде всего, метод не является типом, msdn четко заявляет следующее:

Оператор is используется для проверки является ли тип времени выполнения объекта совместим с заданным типом

Пример

public static void Test (object o) 
{
   Class1 a;

   if (o is Class1) {}
}

Из MSDN:

An выражение выражает true, если выполняются оба следующих условия:

  • выражение не равно нулю.
  • выражение может быть применено к типу. То есть, выражение для выражения формы (типа) (выражение) будет завершено без исключения исключения. Для получения дополнительной информации см. 7.6.6 Экспрессивные выражения.

Итак, причина того, что ваш пример является ложным землей во второй точке, должен быть привязан к определенному типу.

Надеюсь, я не пропустил вопрос.