【发布时间】:2016-02-15 06:57:50
【问题描述】:
我正在阅读this 有人回答的问题建议这种方法:
public static void Method<T>(Func<int,T> del) {
var t = del(42);
}
应该这样使用:Method<SomeType>(x => new SomeType(x));Method 正文对这个问题并不重要。
如果委托/lambda 不是那种“风格”,则该方法将无法按预期工作。例如,如果它被称为Method(x => new Foo());,它将无法“工作”,因为解决方法的目的将丢失。
目的是确保T 有一个构造函数,它采用int 类型的1 个参数。我希望我能做到T(int)
那么无论如何要确保代表应该始终是x => new SomeType(x)?或者有其他选择吗?我查了很多地方,也想不出什么。
【问题讨论】:
-
您可以为接收任意数量的预期参数的方法创建重载。
-
是的,我可以让
Method接受 T 和 int 但它将如何创建Foo?Foo对该方法未知。假设Method在另一个库中。 -
不,我的意思是创建另一个
Method(Func<int> del)会使另一个过载,这样你就可以用任何一个调用它。因为它是你不能让现有的接受Func<int>,因为它需要Func<int, T>。 -
没有。我想要的是
del应该采用x => new Foo(x)的形式,这样我就可以确保Foo有一个构造函数采用int 类型的参数,因为没有这样的通用约束。 -
我认为您可能需要扩展您所询问的内容,从您的问题来看,您似乎希望能够使用两种不同类型的 lambda 调用
Method,但是从 cmets 看来也许您想将其限制为仅接受某种类型,对吗?唯一的方法是为每种预期类型创建一个重载,即为每种类型创建一个重载Method(Func<int, int> del)和`Method(Funcdel) 等。您不能创建通用约束列表或约束到特定类型。