C#: 带有泛型的委托

4
请关注以下内容:
List<Point> lp = lpf.ConvertAll( 
                new Converter<PointF, Point>(PointFToPoint));

在下面的代码中,Converter<PointF, Point>有两个类型参数,而只有一个参数。为什么会这样?
public class Example
{
    public static void Main()
    {
        List<PointF> lpf = new List<PointF>();

        lpf.Add(new PointF(27.8F, 32.62F));
        lpf.Add(new PointF(99.3F, 147.273F));
        lpf.Add(new PointF(7.5F, 1412.2F));

        Console.WriteLine();
        foreach( PointF p in lpf )
        {
            Console.WriteLine(p);
        }

        List<Point> lp = lpf.ConvertAll( 
            new Converter<PointF, Point>(PointFToPoint));

        Console.WriteLine();
        foreach( Point p in lp )
        {
            Console.WriteLine(p);
        }
    }

    public static Point PointFToPoint(PointF pf)
    {
        return new Point(((int) pf.X), ((int) pf.Y));
    }
}

你能更明确一下你的问题吗?仅凭一句话和稍微冗长的代码片段,我不确定我理解你的意图。 - bakasan
我认为作者正在尝试理解有关转换器的 MSDN 文章:http://msdn.microsoft.com/en-us/library/73fe8cwf.aspx - Karim Agha
抱歉!我想了解为什么PointFToPoint只有一个参数? - Ricky
4个回答

2
我不太确定你在这里想要问什么。但是这个表达可以写成这样:

我不太确定您的问题。但是这个表达式可以写成:

List<Point> lp = lpf.ConvertAll( 
            new Converter<PointF, Point>((p) => { return PointFToPoint(p); }));

在这里,“p”是您要转换的点。我不确定这对您有什么帮助,但可能会更清楚一些它的作用。

更新

这个:<PointF,Point>并不意味着该方法需要两个参数。它意味着该方法应该使用一个参数(类型为PointF)并返回一个类型为Point的对象。


2

除了其他答案,为了简化事情,您还可以写成:

List<Point> lp = lpf.ConvertAll(PointFToPoint);

如果您不需要在其他地方使用PointFToPoint方法,您也可以删除整个public static Point PointFToPoint(PointF pf)方法,并使用内联委托代替:
List<Point> lp = lpf.ConvertAll((delegate PointF pf)
    { return new Point(((int) pf.X), ((int) pf.Y)); });

如果你使用的是.NET 3.5,你可以使用lambda缩短代码:

List<Point> lp = lpf.ConvertAll(pf => new Point(((int) pf.X), ((int) pf.Y)));

2

实际上,您只有一个参数传递给转换器,其输出类型是您的转换器的返回类型,输入类型是您参数的输入类型,实例是参数本身。


2

“Converter有两个类型参数?我如何知道传递给Converter()构造函数的方法的参数?”

这是converter委托的定义方式。Converter有两个类型参数,但是您可以通过查看传递给Converter()构造函数的方法的参数来确定这些参数的值。

public delegate TOutput Converter<TInput,TOutput>(TInput input);

当您通过传递符合此签名(接受一个类型的值并将其转换为另一个类型的值)的方法来创建此委托的实例时,还定义了方法的参数。
因此,我的答案是,在创建此转换器时,您非常了解通用转换器方法的具体类型以及方法参数的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接