【发布时间】:2011-08-26 20:07:29
【问题描述】:
这可能以前已经回答过了。我看到许多“动态方法重载解析”问题,但没有一个专门处理传递 dynamic 参数的问题。在下面的代码中,在Test 中,对M 的最后一次调用无法解析(它无法编译)。错误是:调用在[M 的前两个重载]之间不明确。
static void M(Func<int> f) { }
static void M(Func<string> f) { }
static void M(Func<dynamic> f) { }
static dynamic DynamicObject() {
return new object();
}
static void Test() {
M(() => 0);
M(() => "");
M(() => DynamicObject()); //doesn't compile
}
- 为什么,由于类型不是静态已知的,它不能解析为接受
dynamic的重载吗? - 重载方法甚至可以使用
dynamic吗? - 解决此问题的最佳方法是什么?
【问题讨论】:
-
在这里使用泛型不是更好吗?它仍然是模棱两可的(记住动态可以是A也可以是B,编译器怎么知道要调用哪个?)。但是,如果您愿意,我认为您可以将方法更改为
static void M<T>(Func<DataTime, T> f) where T : A和static void M<T>(Func<DataTime, T> f) where T : B,我认为这将允许重载? - 当然Test中的所有方法调用都应该没问题? -
这个例子是人为的,但准确反映我的困境的一个部分是将
dynamic传递给一个重载的方法。如何最好地解决? -
如上所述 - 不要。如何重载一个可以是任何东西的对象?
-
@Smudge:当然你可以接受
object的重载。请参阅 Tigra 的工作示例。 -
不要那样做!改用泛型!
标签: c# dynamic overloading overload-resolution