在C#generics中有没有合理的方法来“默认”types的参数?
在C ++模板中,可以指定某个types参数是默认的。 即除非明确指定,否则将使用typesT.
这可以在C#中完成或近似?
我正在寻找像这样的东西:
public class MyTemplate<T1, T2=string> {}
因此,一个没有明确指定T2
的types的实例:
MyTemplate<int> t = new MyTemplate<int>();
将基本上:
MyTemplate<int, string> t = new MyTemplate<int, string>();
最终,我正在寻找一个案例,其中有一个相当广泛的使用模板,但我正在考虑扩大一个额外的types参数。 我想我可以inheritance,但是我很好奇,如果有其他select的话。
子类化是最好的select。
我会inheritance你的主要generics类:
class BaseGeneric<T,U>
与一个特定的类
class MyGeneric<T> : BaseGeneric<T, string>
这样可以很容易地将逻辑保存在一个地方(基类),但也很容易提供这两种使用选项。 根据课程的不同,可能只需要很less的额外工作就可以做到这一点。
一个解决scheme是子类。 另一个我会用,而不是工厂方法(结合var关键字)。
public class MyTemplate<T1,T2> { public MyTemplate(..args..) { ... } // constructor } public static class MyTemplate{ public static MyTemplate<T1,T2> Create<T1,T2>(..args..) { return new MyTemplate<T1, T2>(... params ...); } public static MyTemplate<T1, string> Create<T1>(...args...) { return new MyTemplate<T1, string>(... params ...); } } var val1 = MyTemplate.Create<int,decimal>(); var val2 = MyTemplate.Create<int>();
在上面的例子中, val2
的types是MyTemplate<int,string>
而不是从它派生的types。
class MyStringTemplate<T>:MyTemplate<T,string>
typesclass MyStringTemplate<T>:MyTemplate<T,string>
与MyTemplate<T,string>
。 这可能会在某些情况下造成一些问题。 例如,您不能将MyTemplate<T,string>
的实例MyTemplate<T,string>
为MyStringTemplate<T>
。
C#不支持这样的function。
正如你所说的,你可以对它进行子类化(如果它不是密封的,并且复制所有的构造函数声明),但这是完全不同的事情。
你也可以像这样创build一个类Overload
public class MyTemplate<T1, T2> { public T1 Prop1 { get; set; } public T2 Prop2 { get; set; } } public class MyTemplate<T1> : MyTemplate<T1, string>{}
不幸的是C#不支持你正在做的事情。 如果参数的默认types必须遵守通用约束,并且在CLR试图确保types安全性时很可能会产生麻烦,那将是一个难以实现的特性。