C# 在.Net中使用动态重载方法

C# 在.Net中使用动态重载方法,c#,dynamic,polymorphism,parameter-passing,overloading,C#,Dynamic,Polymorphism,Parameter Passing,Overloading,我对某些东西的“为什么”有点困惑,我想在推进部署之前得到一些澄清 我有一个DAL库,它将所有数据调用汇集到两个函数中。它实际上是一个函数,但我编写了一个重载来接受数据对象,将其转换为ExpandoObject,并将查询参数构建为KeyValuePairs,以满足原始函数的要求 public static IEnumerable<T> ResultSet<T>(string conn, string query, params KeyValuePair<string,

我对某些东西的“为什么”有点困惑,我想在推进部署之前得到一些澄清

我有一个DAL库,它将所有数据调用汇集到两个函数中。它实际上是一个函数,但我编写了一个重载来接受数据对象,将其转换为
ExpandoObject
,并将查询参数构建为
KeyValuePairs
,以满足原始函数的要求

public static IEnumerable<T> ResultSet<T>(string conn, string query, params KeyValuePair<string, dynamic>[] pmts)...

public static IEnumerable<T> ResultSet<T>(string conn, string query, dynamic dao)…
公共静态IEnumerable结果集(字符串连接、字符串查询、参数KeyValuePair[]pmts)。。。
公共静态IEnumerable结果集(字符串连接、字符串查询、动态dao)…

我的问题是,;为什么这是一个有效的重载?
params
关键字是防止歧义问题的原因吗?由于我使用的是
dynamic
,而且在测试中一切都很好,我觉得我应该在它投入生产之前更好地理解为什么这是一个允许的重载(以免它爆炸)。

有效的重载是定义不同的一切,意思是不完全相同的。这里就是这样。重载定义中没有更多的检查

解决可能的歧义发生在使用地点,即应用调用。 总是可以明确地键入每个参数,并以这种方式选择所需的重载

如果任何类型转换都是必需的并且是隐式的,编译器将尝试找到“更好的转换”。数据丢失的可能性越小越好

只有通过此选择,您最终应用了多个重载并应用了同等级别的转换,您才会在调用位置得到一个歧义错误

如果你打电话

ResultSet<object>("connection", "query", new KeyValuePair<string, dynamic>("test", null));
ResultSet(“连接”,“查询”,新的KeyValuePair(“测试”,null));
您将明确使用第一个重载,因为不需要进行转换。没有转换比转换好