2008-10-17 41 views
6

Tôi có một lớp chung trong C# với 2 cấu trúc:Sử dụng C# params từ khóa trong một constructor của các loại generic

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

Xây dựng một đối tượng sử dụng int như kiểu generic và đi qua trong hai ints như các đối số nguyên nhân ' không chính xác 'constructor được gọi (từ quan điểm của tôi).

Ví dụ: Houses<int> houses = new Houses<int>(1,2) - gọi là construtor thứ 2. Việc truyền vào bất kỳ số lượng ints nào khác vào hàm tạo sẽ gọi hàm tạo đầu tiên.

Có cách nào khác ngoài việc loại bỏ từ khóa param và buộc người dùng chuyển một mảng T khi sử dụng hàm tạo đầu tiên không?

Trả lời

13

Một giải pháp rõ ràng hơn là có hai phương pháp nhà máy tĩnh. Nếu bạn đặt chúng thành một lớp nongeneric, bạn cũng có thể được hưởng lợi từ suy luận kiểu:

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

Ví dụ về cách gọi:

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

Sau đó, nhà xây dựng kiểu generic của bạn không cần "params" bit, và sẽ không có sự nhầm lẫn.

2

Có lẽ thay vì Params bạn có thể vượt qua trong IEnumerable

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

Các nhà xây dựng 2 là một hơn chính xác trận đấu, đó là tiêu chí dùng để đánh giá mà nhà xây dựng là đúng.

2

Do sau kể từ khi ban đầu đã không có quá nhiều thông tin về các lớp vv

Trình biên dịch sẽ quyết định nhà mới (1,2) phù hợp với các nhà xây dựng thứ hai chính xác và sử dụng, nhận thấy rằng tôi lấy câu trả lời với số phiếu bầu cao nhất và nó không hoạt động.

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 
     } 
    } 
} 
Các vấn đề liên quan