je le code suivant:inférence d'expression au cours de l'héritage
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; }
}
Je reçois ce message d'erreur du compilateur:
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.
Si je change l'appel à FigureItOut à ceci:
FigureItOut((Descendant c) => c.Name);
Alors ça marche. Existe-t-il un moyen de compiler le premier exemple en changeant la classe de base à la place?
Je sais que si je fais toute la classe de base générique, comme ceci:
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; }
}
Ensuite, cela fonctionne, mais je préfère ne pas faire, d'autres hacks qui peuvent être employés, peut-être sur le niveau de la méthode (c'est-à-dire changer FigureItOut en quelque sorte).
J'ai ajouté une alternative qui évite l'exigence 'internal' (et la méthode d'extension) –