请关注
List<Point> lp = lpf.ConvertAll(
new Converter<PointF, Point>(PointFToPoint));
在下面的代码中。
Converter<PointF, Point>
包含两个类型参数?为什么PointFToPoint只持有一个参数?
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));
}
}
答案 0 :(得分:2)
好吧,实际上你只有一个传递给转换器的参数,它的输出类型是转换器的返回类型,输入类型是你的参数的输入类型,实例是参数本身。
答案 1 :(得分:2)
我不太确定你在这里问的是什么。但表达式可以写成:
List<Point> lp = lpf.ConvertAll(
new Converter<PointF, Point>((p) => { return PointFToPoint(p); }));
其中p是您要转换的点。我不确定这会对你有什么帮助,但它可能会更清楚它的作用。
<强>更新强>
这个:<PointF, Point>
并不意味着该方法需要两个参数。这意味着它应该采用一个参数(类型为PointF)并返回Point类型的对象。
答案 2 :(得分:2)
“Converter拥有两个类型参数?我如何知道传递给Converter()构造函数的方法的参数?”
这是转换器委托的定义方式。 Converter有两种类型参数吗?我如何知道
的参数public delegate TOutput Converter<TInput,TOutput>(TInput input);
只要通过传递一个遵循此签名的方法(接受一种类型的值并将其转换为另一种类型的值)来创建此委托的实例,您也可以定义该方法的参数。
所以,我的答案是在创建这个转换器时你非常了解泛型Converter方法的具体类型,以及方法参数的类型。
答案 3 :(得分: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)));