使用 Func<> 将 Delegate 对象传递给方法范围
我有一个方法 Foo4,它接受 Func<> 类型的参数。如果我传递匿名类型的参数,则不会出现错误。但是,如果我创建并传递引用具有正确签名的方法的“委托”类型的对象,则会出现编译器错误。我无法理解为什么在这种情况下会出现错误。
class Learn6
{
delegate string Mydelegate(int a);
public void Start()
{
Mydelegate objMydelegate = new Mydelegate(Foo1);
//No Error
Foo4(delegate(int s) { return s.ToString(); });
//This line gives compiler error.
Foo4(objMydelegate);
}
public string Foo1(int a) { return a.ToString();}
public void Foo4(Func<int, string> F) { Console.WriteLine(F(42)); }
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果直接传递对该方法的引用,它会起作用:
这是因为具有相同形状的实际委托本质上并不被认为是兼容的。如果契约是隐式的,编译器会推断契约并将它们匹配。如果它们是显式的(例如声明的类型),则不会执行任何推断 - 它们只是不同的类型。
它类似于:
我们可以看到两个类具有相同的签名并且“兼容”,但编译器将它们视为两种不同的类型,仅此而已。
It works if you pass a reference to the method directly:
This is because actual delegates with the same shape are not inherently considered compatible. If the contracts are implicit, the compiler infers the contract and matches them up. If they are explicit (e.g. declared types) no inference is performed - they are simply different types.
It is similar to:
We can see the two classes have the same signature and are "compatible", but the compiler sees them as two different types, and nothing more.
因为
Func
和MyDelegate
是不同的声明类型。它们恰好兼容同一套方法;但它们之间没有隐式转换。Because
Func<int, string>
andMyDelegate
are different declared types. They happen to be compatible with the same set of methods; but there is no implicit conversion between them.取决于场景,但一般情况下没有理由保留 Mydelegate 类型,只需使用 Func 即可。到处都是:)
depends on the scenario, but in the general case there's no reason to keep around the Mydelegate type, just use Func<int, string> everywhere :)