У меня есть два определения перегруженных методов:
string[] Test1(string data)
А также
string[] Test1(params string[] input)
Когда я вызываю Test1("Single test data")
с намерением вызвать второй метод, вызывается первый метод.
Почему компилятор не помечает этот сценарий, как это было бы для более очевидных сценариев конфликта перегрузки?
2 ответа
Почему компилятор не помечает этот сценарий, как это было бы для более очевидных сценариев конфликта перегрузки?
Потому что правила языка предписывают этого не делать.
Для этого есть очень конкретное правило. Из раздела 12.6.4.3 Спецификация С# 7:
В противном случае, если Mᵢ применим в своей нормальной форме, а Mₑ имеет массив параметров и применим только в расширенной форме, то Mᵢ лучше, чем Mₑ.
В этом случае ваш первый метод применим в обычном виде, а ваш второй метод применим только в расширенном виде, поэтому первый метод лучше второго.
Test1("Single test data")
вызовет второй метод, как вы всегда будете вызывать второй метод? Второй метод легко вызвать, если вы действительно хотите - просто сконструируйте одноэлементный массив самостоятельно.)
Ключевое слово params
предназначено для того, чтобы вы могли задавать методу произвольное количество параметров. То есть «Одиночные тестовые данные» — это ОДИН параметр, тогда как вторая перегрузка позволяет использовать только объект массива в качестве входных данных.
Вы должны дать ему массив строк для вызова второй перегрузки:
using System;
class HelloWorld {
static void Main() {
Test1("one", "two", "three");
}
static string[] Test1(string data) {
Console.WriteLine("First overload");
return new string []{""};
}
static string[] Test1(params string[] input) {
foreach (string str in input)
Console.WriteLine(str);
Console.WriteLine("Second overload");
return new string []{""};
}
}
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.