C# 使用Func将委托对象传递给方法<&燃气轮机;参数
我有一个方法Foo4,它接受Func类型的参数。如果我传递一个匿名类型的参数,我不会得到任何错误。但如果我创建并传递了一个“delegate”类型的对象,该对象引用了一个具有正确签名的方法,则会得到编译器错误。我无法理解为什么在这种情况下我会出错C# 使用Func将委托对象传递给方法<&燃气轮机;参数,c#,.net,c#-3.0,delegates,anonymous-methods,C#,.net,C# 3.0,Delegates,Anonymous Methods,我有一个方法Foo4,它接受Func类型的参数。如果我传递一个匿名类型的参数,我不会得到任何错误。但如果我创建并传递了一个“delegate”类型的对象,该对象引用了一个具有正确签名的方法,则会得到编译器错误。我无法理解为什么在这种情况下我会出错 class Learn6 { delegate string Mydelegate(int a); public void Start() { Mydelegate obj
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)); }
}
类学习6
{
委托字符串Mydelegate(int a);
公开作废开始()
{
Mydelegate objMydelegate=新的Mydelegate(Foo1);
//无误
Foo4(委托(ints){返回s.ToString();});
//这一行给出了编译器错误。
Foo4(objMydelegate);
}
公共字符串Foo1(int a){返回a.ToString();}
公共void Foo4(函数F){Console.WriteLine(F(42));}
}
因为Func
和MyDelegate
是不同的声明类型。它们恰好与同一套方法兼容;但是它们之间没有隐式转换。如果直接将引用传递给该方法,则该转换有效:
Foo4(Foo1);
这是因为具有相同形状的实际代理本质上不被认为是兼容的。如果契约是隐式的,编译器将推断契约并将其匹配。如果它们是显式的(例如声明的类型),则不会执行任何推断-它们只是不同的类型
它类似于:
public class Foo
{
public string Property {get;set;}
}
public class Bar
{
public string Property {get;set;}
}
我们可以看到这两个类具有相同的签名并且是“兼容的”,但编译器将它们视为两种不同的类型,仅此而已。取决于场景,但在一般情况下,没有理由保留Mydelegate类型,只需在任何地方使用Func:)明白您所说的,但当我传递委托时会发生什么(int s){return s.ToString();}to Foo4?。它是否隐式转换为Func?本质上,是的。编译器识别出匿名方法是有效的Func,并有效地将其静默转换为声明string\Anon\u method(int s){…}
和new Func(\Anon\u method\uu)
。但是当您显式地传递一个MyDelegate,其中预期有一个Func时,您会破坏该隐式转换,并得到编译器错误。非常好的问题,另一种方法是Foo4(s=>s.ToString());谢谢。我现在了解到这是由于类型差异造成的,但是当匿名方法像原始代码一样传递给Foo4时会发生什么?@pradeeptp因为匿名方法没有类型,所以类型是推断出来的。事实上,我个人认为他们这样做是很遗憾的。当然命名参数和使用相同的“形状”加载不同的代理,但仍然如此。我想主要原因是C#1中缺少泛型支持,使得无法按现在使用的方式使用Action和Func。我不知道可以这样称呼它。另一个学习。谢谢!)
//This line gives compiler error.
Foo4(objMydelegate);
//This works ok.
Foo4(objMydelegate.Invoke);