문제

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
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top