Вы не можете напрямую конвертировать между делегатами. То, что вы можете сделать, это сделать нового делегата из существующего, совместимого. Так что если вы измените свой код на:
delegateB myFuncDelegate = new delegateB(myTest());
это будет работать. (Обратите внимание, что «совместимость» не обязательно означает, что подписи идентичны - подробности см. В спецификации языка.)
Просто, чтобы сделать это немного понятнее для других читателей, вот простой пример, который не требует вызовов методов.
// Two delegate types with the same signature
delegate void Foo();
delegate void Bar();
class Test
{
static void Main()
{
// Actual value is irrelevant here
Foo foo = null;
// Error: can't convert like this
// Bar bar = foo;
// This works fine
Bar bar = new Bar(foo);
}
}
Обратите внимание, что есть одно исключение из этого правила "без преобразований" - общая дисперсия в C # 4. Например, в C # 4 вы можете написать:
Action<object> foo = x => Console.WriteLine(x.GetHashCode());
Action<string> bar = foo;
... потому что Action<T>
является контравариантным в T
(так что фактически оно объявлено как Action<in T>
). Это ссылочное преобразование - оно не создает новый делегат, как в первом примере. Однако это не доступно только для «совместимых» делегатов - только для общих.