【发布时间】:2010-09-20 16:12:04
【问题描述】:
我有以下代码:
using System;
using System.Linq;
using System.Linq.Expressions;
public class Program
{
public static void Main()
{
Descendant d = new Descendant();
d.TestMethod();
}
}
public class Base
{
protected void FigureItOut<TClass, TMember>(Expression<Func<TClass, TMember>> expr)
{
}
}
public class Descendant : Base
{
public void TestMethod()
{
FigureItOut(c => c.Name);
}
public String Name { get; set; }
}
我收到此编译器错误消息:
The type arguments for method
'Base.FigureItOut<TClass,TMember>
(System.Linq.Expressions.Expression<System.Func<TClass,TMember>>)'
cannot be inferred from the usage. Try specifying the type arguments explicitly.
如果我将对 FigureItOut 的调用更改为:
FigureItOut((Descendant c) => c.Name);
然后就可以了。有没有办法通过更改基类来编译第一个示例?
我知道如果我将整个 Base 类设为通用,如下所示:
public class Base<TDescendant>
{
protected void FigureItOut<TMember>(Expression<Func<TDescendant, TMember>> expr)
{
}
}
public class Descendant : Base<Descendant>
{
public void TestMethod()
{
FigureItOut(c => c.Name);
}
public String Name { get; set; }
}
然后它可以工作,但我宁愿不这样做,任何其他可以使用的技巧,也许是在方法级别(即以某种方式更改 FigureItOut)。
【问题讨论】:
-
我添加了一个替代方案,避免了
internal要求(和扩展方法)
标签: c# compiler-errors expression-trees type-inference