我正在尝试创建一个将返回委托的委托。然后我想调用这个委托,并调用返回的内部委托。我的问题是:为什么这会导致错误?如何更改此代码以完成我正在尝试做的事情?
错误消息是“预期方法名称”。
delegate string del();
delegate Delegate nestedDel();
public static void main()
{
nestedDel myNestedDel = () =>
{
del myInnerDel = () => { return "inside"; };
return myInnerDel;
};
Delegate k = myNestedDel();
k(); // Error!!!
}
答案 0 :(得分:2)
简而言之,你搞砸了这些类型。其中一个代表应返回另一个,因此其返回类型应该只是另一个委托的类型。在您的代码示例中:
delegate string del();
delegate Delegate nestedDel();
您实际上是在返回一个委托,但Delegate
或MulticastDelegate
只是基础结构基类,不能直接调用。通过使用这些类,您将丢失有关参数列表和返回值的信息,因此简单的call()
运算符无法正常工作。正如Lee在评论中提到的那样,你可以通过k.DynamicInvoke()
来做到这一点,但这样做太过分了。只需使用正确的类型名称而不是Delegate
。
工作示例:
delegate string InnerDel();
delegate InnerDel OuterDel(); // this one returns an instance of Inner delegate
public static void Main()
{
OuterDel myOuterDelegate = () =>
{
InnerDel myInnerDel = () => { return "inside"; };
return myInnerDel;
};
InnerDel k = myOuterDelegate();
k();
}
就个人而言,我更喜欢Func / Actions而不是定义我自己的委托类......至少只要它们最多只有几个参数。在func / action方面,它看起来像这样:
public static void Main()
{
Func<Func<string>> myOuterDelegate = () =>
{
Func<string> myInnerDel = () => { return "inside"; };
return myInnerDel;
};
var k = myOuterDelegate();
k();
}
甚至..
public static void Main()
{
Func<Func<string>> myOuterDelegate = () => () => { return "inside"; };
var k = myOuterDelegate();
k();
}
答案 1 :(得分:1)
您的错误是因为无法使用函数调用语法调用Delegate
类型的实例,即k();
。
您可以使用DynamicInvoke
调用它:
string s = (string)k.DynamicInvoke();
显然这很容易出现运行时错误,因此更好的方法是更改nestedDel
的返回类型,例如
delegate Func<string> nestedDel();
nestedDel myNestedDel = () =>
{
Func<string> myInnerDel = () => { return "inside"; };
return myInnerDel;
};
stringk = myNestedDel();