Использование ключевого слова c# params в конструкторе универсальных типов
у меня есть общий класс В C# с 2 конструкторами:
public Houses(params T[] InitialiseElements)
{}
public Houses(int Num, T DefaultValue)
{}
построение объекта с использованием int в качестве универсального типа и передача двух ints в качестве аргументов вызывает вызов "неправильного" конструктора (с моей точки зрения).
Е. Г. Houses<int> houses = new Houses<int>(1,2)
- называет 2-й construtor. Передача любого другого количества ints в конструктор вызовет 1-й конструктор.
есть ли способ обойти это, кроме удаления ключевого слова params и принудительного пользователям передавать массив T при использовании первого конструктора?
4 ответов
более ясным решением было бы иметь два статических заводских метода. Если вы ставите их в класс неуниверсальных, вы также можете воспользоваться вывод типа:
public static class Houses
{
public static Houses<T> CreateFromElements<T>(params T[] initialElements)
{
return new Houses<T>(initialElements);
}
public Houses<T> CreateFromDefault<T>(int count, T defaultValue)
{
return new Houses<T>(count, defaultValue);
}
}
пример вызова:
Houses<string> x = Houses.CreateFromDefault(10, "hi");
Houses<int> y = Houses.CreateFromElements(20, 30, 40);
тогда конструктор вашего универсального типа не нуждается в бит" params", и не будет путаницы.
возможно, вместо Params вы могли бы пройти в IEnumerable
public Houses(IEnumerable<T> InitialiseElements){}
2-й конструктор более точно match, который является критерием, используемым для оценки правильного конструктора.
учитывая следующее, Так как оригинал не имел слишком много информации о классе и т. д.
компилятор собирается решить, что новый дом (1,2) точно соответствует второму конструктору и использует это, обратите внимание, что я взял ответ с наибольшим количеством голосов, и это не сработало.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericTest
{
public class House<T>
{
public House(params T[] values)
{
System.Console.WriteLine("Params T[]");
}
public House(int num, T defaultVal)
{
System.Console.WriteLine("int, T");
}
public static House<T> CreateFromDefault<T>(int count, T defaultVal)
{
return new House<T>(count, defaultVal);
}
}
class Program
{
static void Main(string[] args)
{
House<int> test = new House<int>(1, 2); // prints int, t
House<int> test1 = new House<int>(new int[] {1, 2}); // prints parms
House<string> test2 = new House<string>(1, "string"); // print int, t
House<string> test3 = new House<string>("string", "string"); // print parms
House<int> test4 = House<int>.CreateFromDefault<int>(1, 2); // print int, t
}
}
}