You can't convert between delegates like that directly. What you can do is make a new delegate from an existing, compatible one. So if you change your code to:
delegateB myFuncDelegate = new delegateB(myTest());
that will work. (Note that "compatibility" doesn't necessarily meant that the signatures are identical - see the language specification for details.)
Just to make this slightly clearer to other readers, here's a simpler complete example, which doesn't need any method calls.
// 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);
}
}
Note that there's one exception to this "no conversions" rule - generic variance in C# 4. For example, in C# 4 you can write:
Action<object> foo = x => Console.WriteLine(x.GetHashCode());
Action<string> bar = foo;
... because Action<T>
is contravariant in T
(so it's actually declared as Action<in T>
). This is a reference conversion - it doesn't create a new delegate like the first sample does. However, this isn't available for merely "compatible" delegates - only generic ones.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…