У меня есть следующий код:вывод выражений при наследовании
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; }
}
Тогда это работает, но я бы скорее не делать этого, любые другие писаки, которые могут быть использованы, возможно, на уровень метода (т. е. изменить РисунокItOut так или иначе).
Я добавил альтернативу, которая позволяет избежать требования «внутреннего» (и метода расширения) – 2008-11-04 13:19:41