【发布时间】:2015-06-22 14:08:57
【问题描述】:
短版:
当一个接受Expression<Action>,另一个接受Expression<Action<T>>时,重载两种方法的最佳方式是什么?
加长版:
假设我在一个(设计糟糕的)类中有以下方法:
void Main()
{
Foo(t => Bar(t));
}
void Foo(Expression<Action> action)
{
"Method 1!".Dump();
}
void Foo<T>(Expression<Action<T>> action)
{
"Method 2!".Dump();
}
void Bar(String thing)
{
// Some bar-like thing
}
现在,可能是我特别昏暗,但我希望从 Main 方法调用“方法 2”。
唯一的限制是我需要传递一个Expression<...>,因为我们根据表达式树在其他地方做一些魔术。
我的理由是这样的:
- 泛型不是真实的 - 它们是编译器技巧
-
Action<T>实际上是与Action非常不同的委托类型 - 因此应该调用方法 2,因为编译器拥有进行推理所需的所有信息。
实际发生的情况是我得到一个编译器错误,大意是我试图将一个参数传递给一个不接受任何参数的动作......即。 Method 1 正在成为目标。
附带说明,如果我像这样明确指定泛型参数,这将按预期工作:
Foo<String>(t => Bar(t));
您对此的想法将不胜感激!
【问题讨论】:
-
“泛型不是真实的——它们是编译器的把戏”:不,它们是真实的。 .NET 已经具体化了泛型,这与使用类型擦除的 Java 不同。
-
我的真正意思是'在这种情况下泛型并不真实,因为编译器创建了一个新的重整类型来表示
Action<T>'......但你是对的:)跨度> -
我已经修复了我的答案(之前被严重破坏)但这只能解释现有行为 - 它不能帮助您解决问题,因为我们没有足够的上下文。如果您提供更多背景信息,我们或许可以提供更多帮助。
标签: c# generics overloading