Ответ 1
Вы не можете напрямую конвертировать между делегатами. Вы можете сделать новый делегат из существующего, совместимого. Поэтому, если вы измените свой код на:
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);
}
}
Обратите внимание, что существует одно исключение из этого правила "без конверсий" - общая дисперсия в С# 4. Например, в С# 4 вы можете написать:
Action<object> foo = x => Console.WriteLine(x.GetHashCode());
Action<string> bar = foo;
... потому что Action<T>
является контравариантным в T
(поэтому он фактически объявлен как Action<in T>
). Это ссылочное преобразование - он не создает нового делегата, как это делает первый образец. Однако это не доступно для просто "совместимых" делегатов - только общие.