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的答案。这两个都是很好的解决方案。这是最好的和最相关的答案,我不应该仅仅因为重载了前一个函数就重命名我的函数