在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安全性时很可能会产生麻烦,那将是一个难以实现的特性。