使用泛型类型参数创建匿名函数?
Create anonymous function using generic type parameters?
假设我有这个方法:
int MyMethod(int arg)
{
return arg;
}
我可以像这样创建一个匿名的等价物:
Func<int, int> MyAnonMethod = (arg) =>
{
return arg;
};
但是假设我有一个使用泛型类型参数的方法,如下所示:
T MyMethod<T>(T arg)
{
return arg;
}
如何创建 that 作为匿名方法?
泛型的所有具体方法都是匿名的。你不能反过来。
这样做很简单:
T MyMethod<T>(T arg)
{
return arg;
}
//...
Func<int, int> MyAnonMethod = MyMethod<int>;
MyAnonMethod(1); // returns 1
如果直接使用MyMethod
,它会隐式使用适当的类型,例如:
MyMethod(1); // returns 1 of type int
你可以使用
Func<T, T> MyAnonMethod = (arg) =>
{
return arg;
};
如果你在某个地点(方法,class)你有 T
。如果你没有 T
你可以创建一个 returns 一个 Func 的方法,比如:
Func<T, T> CreateMyAnonMethod()
{
returns (arg) => { return arg; };
}
你有两个选择:
- 您创建了一个具体的委托对象,它指定了
T
的类型
- 您在通用上下文中声明委托,使用现有的
T
。
第一个例子
var f = new Func<int, int>(MyMethod<int>);
var result = f(10);
第二个例子
T Test<T>()
{
T arg = default(T);
Func<T, T> func = MyMethod; // Generic delegate
return func(arg);
}
// Define other methods and classes here
T MyMethod<T>(T arg)
{
return arg;
}
您将无法说服编译器或智能感知在非泛型上下文中为委托携带泛型 T
,然后在调用它时计算出实际的 T
。
所以这是不合法的:
void Test()
{
var fn = new Func<T, T>(MyMethod<T>);
fn(10); // returns 10
fn("Test"); // returns "Test"
}
假设我有这个方法:
int MyMethod(int arg)
{
return arg;
}
我可以像这样创建一个匿名的等价物:
Func<int, int> MyAnonMethod = (arg) =>
{
return arg;
};
但是假设我有一个使用泛型类型参数的方法,如下所示:
T MyMethod<T>(T arg)
{
return arg;
}
如何创建 that 作为匿名方法?
泛型的所有具体方法都是匿名的。你不能反过来。
这样做很简单:
T MyMethod<T>(T arg)
{
return arg;
}
//...
Func<int, int> MyAnonMethod = MyMethod<int>;
MyAnonMethod(1); // returns 1
如果直接使用MyMethod
,它会隐式使用适当的类型,例如:
MyMethod(1); // returns 1 of type int
你可以使用
Func<T, T> MyAnonMethod = (arg) =>
{
return arg;
};
如果你在某个地点(方法,class)你有 T
。如果你没有 T
你可以创建一个 returns 一个 Func 的方法,比如:
Func<T, T> CreateMyAnonMethod()
{
returns (arg) => { return arg; };
}
你有两个选择:
- 您创建了一个具体的委托对象,它指定了
T
的类型
- 您在通用上下文中声明委托,使用现有的
T
。
第一个例子
var f = new Func<int, int>(MyMethod<int>);
var result = f(10);
第二个例子
T Test<T>()
{
T arg = default(T);
Func<T, T> func = MyMethod; // Generic delegate
return func(arg);
}
// Define other methods and classes here
T MyMethod<T>(T arg)
{
return arg;
}
您将无法说服编译器或智能感知在非泛型上下文中为委托携带泛型 T
,然后在调用它时计算出实际的 T
。
所以这是不合法的:
void Test()
{
var fn = new Func<T, T>(MyMethod<T>);
fn(10); // returns 10
fn("Test"); // returns "Test"
}