Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Func将委托对象传递给方法<&燃气轮机;参数_C#_.net_C# 3.0_Delegates_Anonymous Methods - Fatal编程技术网

C# 使用Func将委托对象传递给方法<&燃气轮机;参数

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

我有一个方法Foo4,它接受Func类型的参数。如果我传递一个匿名类型的参数,我不会得到任何错误。但如果我创建并传递了一个“delegate”类型的对象,该对象引用了一个具有正确签名的方法,则会得到编译器错误。我无法理解为什么在这种情况下我会出错

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);