Luc*_*ero 1 c# generics lambda
我有重载的方法,一种是通用的,一种是非通用的。这两种方法都接收 Linq 表达式作为单个参数:
public void Test(Expression<Action<char>> expr) {}
public void Test<T>(Expression<Func<char, T>> expr) {}
Run Code Online (Sandbox Code Playgroud)
现在考虑以下调用:
var sb = new StringBuilder();
Test(c => sb.Append(c));
Run Code Online (Sandbox Code Playgroud)
编译器将选择通用方法,因为该Append()方法(不幸的是)返回一个StringBuilder. 但是,就我而言,我绝对需要调用非泛型方法。
以下解决方法表明代码不存在类型问题(非泛型调用将完全有效):
Expression<Action<char>> expr = c => sb.Append(c);
Test(expr);
Run Code Online (Sandbox Code Playgroud)
但是,我不想声明具有显式类型的变量,而是以某种方式让编译器选择非泛型方法(就像我可以告诉它使用具有显式类型参数的泛型方法一样)。
您可以在SharpLab.io上玩这个。
这似乎是一种解决方法(因为确实如此),但您可以使用命名参数来阐明您正在调用哪个方法。
static public void Test(Expression<Action<char>> action)
{
Console.WriteLine("Test()");
}
static public void Test<T>(Expression<Func<char, T>> func)
{
Console.WriteLine("Test<T>()");
}
Run Code Online (Sandbox Code Playgroud)
当您需要非泛型版本时,只需action:在参数列表中提供参数名称即可。
static public void Main()
{
var sb = new StringBuilder();
Test(action: c => sb.Append(c) );
Test(func: c => sb.Append(c) );
}
Run Code Online (Sandbox Code Playgroud)
输出:
Test()
Test<T>()
Run Code Online (Sandbox Code Playgroud)
这可能比写出表达式转换更容易使用。
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |