C#:具有相同名称和不同签名的多个函数,但编译器调用了错误的函数。如何修复它?
我有两个职能:C#:具有相同名称和不同签名的多个函数,但编译器调用了错误的函数。如何修复它?,c#,function,C#,Function,我有两个职能: partial class Database { public void Insert(string table, params string[] values) { string query = "INSERT INTO [{0}] VALUES ('{1}')"; ExecuteNonQuery(string.Format(query, table, string.Join("','", values))); }
partial class Database
{
public void Insert(string table, params string[] values)
{
string query = "INSERT INTO [{0}] VALUES ('{1}')";
ExecuteNonQuery(string.Format(query, table, string.Join("','", values)));
}
public string Insert(string table, string returnedColumn, params string[] values)
{
string query = "INSERT INTO [{0}] OUTPUT INSERTED.{1} VALUES ('{2}')";
return ExecuteScalar(string.Format(query, table, returnedColumn, string.Join("','", values))).ToString();
}
}
它们都在数据库中的表上执行INSERT
。不同之处在于,虽然第一个命令仅将数据插入数据库,但第二个命令还使用SQL中的OUTPUT
关键字从插入行中的一列返回值
问题是,当我试图调用第一个函数时,编译器调用第二个函数。例如,如果我有以下代码:
Database DB = new Database();
DB.Insert("tableName", "some data");
Visual studio实际上将其视为我调用了第二个函数:
问题是什么?我如何解决?谢谢。您可以将第二个参数包装在一个数组中,该数组将强制选择要选择的重载:
DB.Insert("tableName", new[] { "some data" });
问题是您正在调用Insert(string,string),因为params是可选的。编译器基本上认为应该选择第二个,因为它匹配得更紧密
我的第一反应是用不同的方法命名。作为一个名为Insert的方法,我们应该按照它所说的做:Insert stuff。如果它返回一些东西,我想在调用函数之前知道它的相似之处。当然,我可以读取第二个参数并知道它返回什么。使用命名参数调用它
Database d = new Database();
//ExecuteScalar
d.Insert(table: "demoTabele", returnedColumn: "returnedColumn",values: new string[]{"rest arguments1", "rest arguments2"});
//ExecuteNonQuery
d.Insert(table: "demoTabele", values: new string[] { "rest arguments1", "rest arguments2" });
问题是您正在调用Insert(string,string),因为params是可选的。您的编译器基本上认为应该选择第二个,因为它匹配得更紧密。我不确定您是否阅读了与我相同的C#规范,但这是要调用的正确重载。为什么不呢?我想你应该给这些方法起不同的名字,因为它们做的事情不同。我真的建议你听@MatthewWatson。正如我在回答中补充的那样。当然,你的选择是:)如果你保持原样,有人意外调用错误方法的几率非常高。这是一个很棒的答案。我真的不知道是选择它还是@Lee的答案。这两个都是很好的解决方案。这是最好的和最相关的答案,我不应该仅仅因为重载了前一个函数就重命名我的函数