Тип аргумента делегата C # - PullRequest
       9

Тип аргумента делегата C #

1 голос
/ 26 сентября 2019
    delegate void Dele(string str);
    delegate void Alli(int num);

    class Program
    {
        static void Main(string[] args)
        {
            Dele dele = Test; // O
            Alli alli = Test; // X          
        }        

        static void Test(object obj) { }
    } 

Alli alli = Test; // X
Почему ???

Может быть ...
str as object (O)
num as object (X)
???

(Извините, я плохо владею английским языком)
(Похоже, ваше сообщение в основном написано на коде; пожалуйста, добавьте еще несколько деталей. ОК)

1 Ответ

4 голосов
/ 26 сентября 2019

Это поведение указано в спецификации языка 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.

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