일반 유형의 생성자에서 c# params 키워드 사용
문제
C#에는 2 개의 생성자가있는 일반 클래스가 있습니다.
public Houses(params T[] InitialiseElements)
{}
public Houses(int Num, T DefaultValue)
{}
int를 일반 유형으로 사용하여 객체를 구성하고 인수로 두 개의 int를 통과하면 '부정확 한'생성자가 (내 관점에서) 호출됩니다.
예를 들어 Houses<int> houses = new Houses<int>(1,2)
- 두 번째 아편 고속도로를 호출합니다. 다른 수의 Ints를 생성자로 전달하면 첫 번째 생성자를 호출합니다.
Params 키워드를 제거하고 첫 번째 생성자를 사용할 때 사용자가 T 배열을 전달하도록 강요하는 것 외에는 이와 관련하여 어떤 방법이 있습니까?
해결책
더 명확한 솔루션은 두 가지 정적 공장 방법을 갖는 것입니다. 이를 비 유전자 클래스에 넣으면 유형 추론의 혜택을 누릴 수 있습니다.
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);
그런 다음 일반 유형의 생성자는 "매개 변수"비트가 필요하지 않으며 혼란이 없습니다.
다른 팁
아마도 매개 변수 대신 ienumerable을 통과 할 수 있습니다
public Houses(IEnumerable<T> InitialiseElements){}
두 번째 생성자가 더 많습니다 정확한 일치, 이것은 어떤 생성자가 올바른지 평가하는 데 사용되는 기준입니다.
원본이 수업 등에 대한 정보가 너무 많지 않았기 때문에 다음을 감안할 때
컴파일러는 새 집 (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
}
}
}
제휴하지 않습니다 StackOverflow