编译器如何推断委托示例中的类型?

时间:2009-09-29 21:58:42

标签: c# delegates

在下面的委托示例中,编译器如何推断变量alpha的类型是什么?

delegate double Doubler(double x);

public class Test
{
    Doubler dbl = (alpha) => //How does it determine what type is alpha?
    {
        return alpha * 2
    };

    Console.WriteLine(dbl(10)); //Is it when the method is called?  int here;

    Console.WriteLine(dbl(5.5)); //double here???
}

我在网站上发现了这个声明,我想根据回答,是不正确的?

“在我们的示例中,我们指定了参数的类型。如果需要,可以让编译器找出参数的类型。在这种情况下,只传递参数的名称而不是它的类型。这是一个例子:“

3 个答案:

答案 0 :(得分:6)

您在代表中声明它。

delegate double Doubler(double x);

x是你的alpha。

您可以使用以下代码轻松替换代码:

Doubler dbl = delegate (double x)
{
   return x*2;
};

您也可以简化lambda表达式:

Doubler dbl = alpha => alpha*2;

答案 1 :(得分:5)

这种语言功能看起来很简单,但实际上非常复杂。这里需要花费太多空间来准确描述此功能的所有后果。如果你真的对编译器如何计算lambda的形式参数的类型感兴趣,你应该阅读我讨论我们如何做到这一点的五篇系列文章,以及后果是什么编译器设计。

以下是我所有文章的档案,其中讨论了lambda表达式的含义:

http://blogs.msdn.com/ericlippert/archive/tags/Lambda+Expressions/default.aspx

您应该阅读题为“Lambda表达式与匿名方法”的系列。

如果您对编译器如何执行其他类型推断感兴趣,请参阅我的文章存档:

http://blogs.msdn.com/ericlippert/archive/tags/Type+Inference/default.aspx

如果你是那种喜欢观看视频阅读文字的人,这里是我在2006年制作的视频,解释了一些类型推断场景:

http://blogs.msdn.com/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx

答案 2 :(得分:1)

您在定义Doubler委托时指定了输入类型为double。对于这两个示例,输入类型为double。