Это поведение указано в спецификации языка C #.
Здесь:
Dele dele = Test;
Вы выполняете преобразование группы методов .Одно из требований для преобразования группы методов, которое должно быть разрешено, заключается в том, что
Выбранный метод M должен быть совместим (совместимость делегата) с типом делегата D, иначе возникнет ошибка времени компиляции.
Совместимость делегата определяется следующим образом (выделено мной):
Метод или делегат M совместим с типом делегата D, если всеверно следующее:
- D и M имеют одинаковое количество параметров, и каждый параметр в D имеет те же модификаторы ref или out, что и соответствующий параметр в M.
- Для каждого параметра значения (параметра без модификатора ref или out) существует преобразование идентификатора (преобразование идентификатора) или неявное преобразование ссылки (неявное преобразование ссылки) из типа параметра в D в соответствующий тип параметра в M.
- Для каждого параметра ref или out тип параметра в D совпадает с типом параметра в M.
- Идентификаторсущность или неявное ссылочное преобразование существует из возвращаемого типа M в возвращаемый тип D.
Там - это неявное ссылочное преобразование из string
в object
, поскольку string
является подклассом object
, но не является неявным преобразованием ссылок из int
в object
.int
является типом значения, поэтому преобразование на самом деле является преобразованием бокса .Поэтому преобразование группы методов не работает для Alli
и Test
.