我在C#中有一个带有2个构造函数的泛型类:
public Houses(params T[] InitialiseElements)
{}
public Houses(int Num, T DefaultValue)
{}
使用int作为泛型类型构造一个对象并传入两个int作为参数会导致调用“不正确”的构造函数(从我的角度来看)。
E.g。 Houses<int> houses = new Houses<int>(1,2)
- 致电第二个顾问。将任意其他数量的int传递给构造函数将调用第一个构造函数。
除了删除params关键字并强制用户在使用第一个构造函数时传递T数组时,还有其他方法吗?
答案 0 :(得分:15)
更清晰的解决方案是拥有两个静态工厂方法。如果将它们放入非泛型类中,您也可以从类型推断中受益:
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);
然后你的泛型类型的构造函数不需要“params”位,并且不会有混淆。
答案 1 :(得分:2)
也许代替Params你可以传入IEnumerable
public Houses(IEnumerable<T> InitialiseElements){}
答案 2 :(得分:2)
第二个构造函数是一个更精确的精确匹配,这是用于评估哪个构造函数正确的标准。
答案 3 :(得分:2)
考虑到以下因为原作没有太多关于班级等的信息。
编译器将决定新的House(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
}
}
}