Frage

Ich habe eine generische Klasse in C # mit 2 Konstrukteurs:

public Houses(params T[] InitialiseElements)
{}
public Houses(int Num, T DefaultValue)
{}

Der Bau eines Objekts int als gattungs Verwendung und Weitergabe in zwei ints als Argumente bewirkt die ‚falsche‘ Konstruktor aufgerufen werden (aus meiner Sicht).

z. Houses<int> houses = new Houses<int>(1,2) - ruft den zweiten construtor. Passing in jeder anderen Zahl von Ints in den Konstruktor wird die 1. Konstruktor aufrufen.

Gibt es eine Möglichkeit, um diese andere als das Schlüsselwort params entfernen und zwingen Benutzer eine Reihe von T zu übergeben, wenn der ersten Konstruktor?

War es hilfreich?

Lösung

Eine klarere Lösung wäre es, zwei statische Factory-Methoden zu haben. Wenn Sie diese in eine nicht generische Klasse setzen, können Sie auch aus Typinferenz profitieren:

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);
    }
}

Beispiel für den Aufruf:

Houses<string> x = Houses.CreateFromDefault(10, "hi");
Houses<int> y = Houses.CreateFromElements(20, 30, 40);

Dann wird Ihr generischer Typ Konstruktor nicht braucht die „params“ Bit, und es würde keine Verwirrung sein.

Andere Tipps

Vielleicht statt Params Sie in IEnumerable passieren könnte

public Houses(IEnumerable<T> InitialiseElements){}

Der zweite Konstruktor ist ein genau Spiel, die die Kriterien zu beurteilen, welche Konstruktor korrekt ist.

Die folgenden seit dem ursprünglichen Da nicht zu viele Informationen hatte auf die Klasse etc.

Die Compiler neues Haus entscheiden wird (1,2) entspricht den zweiten Konstruktor genau und verwendet, die feststellen, dass ich die Antwort nahm mit den meisten up-Stimmen und es hat nicht funktioniert.

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
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top