`где T: Delegate` или` где T: MulticastDelegate`? - PullRequest
4 голосов
/ 24 января 2020

C# 7.3 добавлена ​​поддержка для ограничения универсального параметра типа c на тип делегата.

public class UsingDelegate<T> where T : System.Delegate { }
public class Multicaster<T> where T : System.MulticastDelegate { }

Это может быть тривиально, но есть ли практическая разница между where T : System.Delegate и where T : System.MulticastDelegate? Это недокументировано в Документах Microsoft.

1 Ответ

2 голосов
/ 24 января 2020

Мы не можем создавать экземпляры классов Delegate и MulticastDelegate, так как эти классы abstract:

 public abstract class Delegate : ICloneable, ISerializable { ... }

 public abstract class MulticastDelegate : Delegate { ... }

Основной способ работы с делегатами - ключевое слово delegate. Компилятор C# создает экземпляры класса, производного от MulticastDelegate, когда мы используем ключевое слово языка C# delegate для объявления типов делегатов.

Причина, по которой C# создает компилятор экземпляры класса, производного от MulticastDelegate:

Этот дизайн имеет свои корни в первом выпуске C# и. NET. Одной из целей команды разработчиков было обеспечение того, чтобы язык обеспечивал безопасность типов при использовании делегатов. Это означало, что делегаты вызывались с правильным типом и количеством аргументов. И что любой тип возврата был правильно указан во время компиляции. Делегаты были частью релиза 1.0. NET, который был до дженериков.

Наилучшим способом обеспечения безопасности этого типа было создание компилятором конкретных классов делегатов, представляющих используемую сигнатуру метода.

Даже если вы не можете создавать производные классы напрямую, вы будете использовать методы, определенные для этих классов.

Видно, что делегаты были частью 1.0. NET release, который был до обобщения , поэтому можно сделать вывод, что ограничение where T : System.Delegate { } существует в C# 7.3 по исторической причине для обеспечения безопасности типов для компилятора путем создания конкретных классов делегатов, представляющих сигнатуру метода, являющуюся используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...