2008-10-17 17 views
6

ich eine generische Klasse in C# mit 2 Konstrukteure haben:Verwendung von C# params Schlüsselwort in einem Konstruktor von generischen Typen

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

Constructing ein Objekt int als gattungs verwendet und in zwei ints als Argumente zu übergeben bewirkt, dass die ' falscher Konstruktor, der aufgerufen werden soll (aus meiner Sicht).

z. Houses<int> houses = new Houses<int>(1,2) - ruft den zweiten Konstruktor auf. Wenn Sie eine andere Anzahl von Ints in den Konstruktor eingeben, wird der 1. Konstruktor aufgerufen.

Gibt es einen anderen Weg als das params-Schlüsselwort zu entfernen und Benutzer zu zwingen, ein Array von T zu übergeben, wenn der erste Konstruktor verwendet wird?

Antwort

13

Eine klarere Lösung wäre, zwei statische Fabrikmethoden 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 die „params“ Bit benötigen, und es wird keine Verwirrung geben.

2

Vielleicht statt Params Sie in IEnumerable

public Houses(IEnumerable<T> InitialiseElements){} 
2

Der zweiten Konstruktor ist ein weiteres genaues Spiel, die die Kriterien zu beurteilen, welche Konstruktor korrekt passieren könnten.

2

folgenden gegeben, da das Original nicht zu viel Informationen über die Klasse hatte usw.

Der Compiler neue Haus entscheiden wird (1,2) entspricht dem zweiten Konstruktor genau und verwenden, die, dass ich merke, nahm die Antwort mit den meisten 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 
     } 
    } 
} 
Verwandte Themen