【发布时间】:2023-03-12 03:55:02
【问题描述】:
我有一些扩展方法使用 Expression 参数来拉入属性成员并对其进行操作,并且对于成员是 IEnumerable。但是,从泛型类内部调用时,它似乎与预期的方法重载不匹配(for r4 below)。在类之外选择了正确的方法。
这里发生了什么?这会奏效吗?还是我需要寻找新方法?
(这是在 C# 5 中)
public class Test
{
public void MyTest()
{
// returns "Object"
var r1 = new MyClass<object>().Ext(a => a.Content);
// returns "Enumerable"
var r2 = new MyClass<IEnumerable<object>>().Ext(a => a.Content);
// returns "Object"
var r3 = new MyClass<object>().TestExt();
// returns "Object" (I was expecting "Enumerable")
var r4 = new MyClass<IEnumerable<object>>().TestExt();
// returns "Enumerable"
var r5 = new MyClass<int>().TestExt2();
}
}
public class MyClass<T>
{
public T Content { get; set; }
public IEnumerable<object> OtherContent { get; set; }
public string TestExt()
{
return this.Ext(a => a.Content);
}
public string TestExt2()
{
return this.Ext(a => a.OtherContent);
}
}
public static class MyExtensions
{
public static string Ext<T>(this T obj, Expression<Func<T, IEnumerable<object>>> memberExpression)
{
return "Enumerable";
}
public static string Ext<T>(this T obj, Expression<Func<T, object>> memberExpression)
{
return "Object";
}
}
【问题讨论】:
-
@KingKing 见
r4声明旁边的评论
标签: c# generics extension-methods overloading