2016-03-03 2 views
3

У меня есть две функции:C#: Несколько функций с тем же именем и другой подписью, но компилятор не отвечает. Как это исправить?

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.

Проблема в том, что когда я пытаюсь вызвать первую функцию, компилятор вызывает вторую. Так, например, если у меня есть этот код:

Database DB = new Database(); 
DB.Insert("tableName", "some data"); 

Visual Studio на самом деле относится к нему, как если бы я назвал вторую функцию: enter image description here

В чем проблема и как я могу решить эту проблему? Благодарю.

+0

'DB.Insert ("TableName", новый [] { "некоторые данные"});' – PetSerAl

+1

Проблема заключается в том, что вы звоните Insert (строка , string), поскольку params является необязательным. Ваш компилятор в основном думает, что он должен выбрать второй, потому что он соответствует более близко. – Blackunknown

+1

Я не уверен, что вы читаете ту же спецификацию C#, что и я, но это правильная перегрузка для вызова. Почему бы и нет? – Luaan

ответ

3

вызова его с помощью имени параметра

 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" }); 
+0

Это замечательный ответ. Я действительно не знаю, выбирая его или ответ @ Lee. Оба являются прекрасными решениями. – Sipo

+0

Это лучший и самый подходящий ответ, я не должен переименовывать свою функцию только потому, что он перегружает предыдущий –

5

Вы можете обернуть свой второй аргумент в массиве, который заставит перегрузку вы хотите выбрать:

DB.Insert("tableName", new[] { "some data" }); 
4

Проблема заключается в том, что вы звоните Insert (строку, строка), потому что PARAMS не является обязательным. Ваш компилятор в основном думает, что он должен выбрать второй, потому что он соответствует более близко.

Моим первым инстинктом было бы назвать методы по-разному. Увидев, как метод «Вставить» должен делать то, что он говорит: вставить материал. Если он возвращает что-то, я хотел бы знать, что это напоминает, прежде чем я вызову функцию. Конечно, я могу прочитать второй параметр и узнать, что он возвращает.

Смежные вопросы