Какова цель модификатора extern в событии?

При просмотре С# Language Specification 5.0 стало известно, что вы можете определить extern event. Я привык к методам extern для вызова платформы и встроенным обратным вызовам. Я не сталкивался с этой концепцией за одиннадцать лет в мире .NET.

  • Что событие extern взаимодействует с?
  • Предоставляет ли она возможность подписаться на какое-то собственное событие?
  • Вы можете поднять такое событие?
  • Какие проблемы он решает, заработав свое место на языке С#?

Я просмотрел спецификации для "extern" и обнаружил, что свойства, индексы, конструкторы, статические конструкторы, финализаторы (!) и даже операторы (!) могут быть extern. Поля не могут. (Я также узнал, что псевдоним пространства имен может быть "extern", но это означает что-то совсем другое.)

Изменить: Это проясняет ситуацию. Таким образом, extern применяется не к концепции события или концепции свойства, а к составным методам. Это верно? Разве COM-события отличаются от событий DllImport?

Ответ 1

Я никогда раньше этого не видел, и поиск действительно не вызывает каких-либо реальных применений, но может найти его в компиляторе Roslyn testsuite:

using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

public class C
{
    [method: DllImport("c")]
    public extern static event System.Action G;
}

Тест проверяет, что он импортирует функции add_G и remove_G из DLL c. Поскольку импортируются только методы доступа, нет возможности для c или любого из его пользователей поднять это событие, которое может быть выполнено только внешней DLL.

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

Что касается вашего редактирования, свойства, индексы, конструкторы, статические конструкторы, финализаторы, операторы имеют одну общую черту: они - методы. Причудливые методы, но методы тем не менее. То же самое для аксессуаров событий. И поскольку методы могут быть extern, это относится ко всем методам, если только правила не имеют особых исключений. Конкретные исключения требуют работы, и преимущества этой работы должны перевесить затраты. В этом случае в таких случаях практически нет преимуществ для отклонения extern.