c# - 强制 C# 编译器使用带有 Linq 表达式参数的非泛型方法重载
问题描述
我有重载方法,一种是泛型的,一种是非泛型的。这两种方法都接收一个 Linq 表达式作为单个参数:
public void Test(Expression<Action<char>> expr) {}
public void Test<T>(Expression<Func<char, T>> expr) {}
现在考虑以下调用:
var sb = new StringBuilder();
Test(c => sb.Append(c));
编译器将选择泛型方法,因为该Append()
方法确实(不幸地)返回 a StringBuilder
。但是,就我而言,我绝对需要调用非泛型方法。
以下解决方法表明代码没有类型问题(非泛型调用将完全有效):
Expression<Action<char>> expr = c => sb.Append(c);
Test(expr);
但是,我不希望声明具有显式类型的变量,而是以某种方式让编译器选择非泛型方法(就像我可以告诉它使用具有显式类型参数的泛型方法一样)。
你可以在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>()");
}
当您需要非通用版本时,只需action:
在参数列表中提供参数名称即可。
static public void Main()
{
var sb = new StringBuilder();
Test(action: c => sb.Append(c) );
Test(func: c => sb.Append(c) );
}
输出:
Test()
Test<T>()
这可能比写出表达式转换更容易使用。
推荐阅读
- string - 如何在xceptor中将字符串转换为数字
- php - 在 Woocommerce 管理员订单列表上处理多个自定义批量操作
- c - 定义Linux中C程序允许的最大char []数组大小
- uwp - 桌面桥 SQLite
- php - 开始使用 Google 存储
- python - 下面代码中这一行的含义是什么?
- spring - oracle物理连接在关闭时会影响性能吗
- google-cloud-firestore - 是否可以为尚不存在的父文档插入子集合实体?
- c# - 为什么 LINQ to Entities string.Contains(string.Empty) 除了 string.Contains(string.Empty.ToLower()) 什么都不匹配?
- php - 如何从此代码中为每一行更新 MySQL?