2010-02-08 3 views
2

Я смотрю на метод BackgroundWorker.ReportProgress. Он может принимать 1 param (int) или два параметра (int, object).Назначить делегата, который принимает параметры

Если я хочу, чтобы назначить ReportProgress так:

var ReportProgressMethod = backgroundWorker.ReportProgress; 

Я получаю сообщение об ошибке сказав, что существует неоднозначная ссылка, потому что (конечно же) метод может принимать к наборам параметров.

Как изменить приведенный выше оператор, чтобы сказать, что я хочу использовать версию метода int, object.

(Идея заключается в том, что я хочу передать ReportProgressMethod в качестве параметра метода.)

ответ

13
Action<int, object> reportProgressMethod = backgroundWorker.ReportProgress; 
+0

благодарит за обозначение кода. Я не был уверен, что компилятор может использовать информацию о типе из lhs, чтобы определить метод перегрузки –

+0

Как работает bizzare, который полностью работает ... –

2

Там в несколько способов, вы можете помочь компилятору, но в основном вам просто нужно сделать тип делегата явным так или иначе. Мой предпочел бы это:

var ReportProgressMethod = new Action<int,object>(backgroundWorker.ReportProgress); 

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

+0

Не думаю, что текущий компилятор задает типы делегатов. – Jimmy

+0

Argh и SO удаляют углы, когда это не код –

+0

@jimmy, когда он набирается с правой стороны, но нет, если rhs является выражением лямбда –