C#泛型中是否有合理的“默认”类型参数方法?

时间:2009-04-01 23:51:00

标签: c# generics types default parameters

在C ++模板中,可以指定某个类型参数是默认值。即除非明确指定,否则它将使用类型T.

可以在C#中完成或近似吗?

我正在寻找类似的东西:

public class MyTemplate<T1, T2=string> {}

这样一个没有明确指定T2的类型的实例:

MyTemplate<int> t = new MyTemplate<int>();

本质上是:

MyTemplate<int, string> t = new MyTemplate<int, string>();

最终我正在研究一个案例,其中有一个相当广泛使用的模板,但我正在考虑使用其他类型参数进行扩展。我想,我可以继承,但我很好奇是否还有其他选择。

5 个答案:

答案 0 :(得分:67)

子类化是最好的选择。

我会将你的主要泛型类子类化:

class BaseGeneric<T,U>

具有特定类

class MyGeneric<T> : BaseGeneric<T, string>

这使您可以轻松地将逻辑保存在一个位置(基类),但也很容易提供两种使用选项。根据班级的不同,实现这一目标可能需要额外的工作。

答案 1 :(得分:16)

一种解决方案是子类化。我将使用的另一个是工厂方法(与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的类型为MyTemplate<int,string> ,而不是从中派生的类型。

类型class MyStringTemplate<T>:MyTemplate<T,string>MyTemplate<T,string>的类型不同。 这可能会在某些情况下造成一些问题。 例如,您无法将MyTemplate<T,string>的实例投射到MyStringTemplate<T>

答案 2 :(得分:10)

你也可以像这样创建一个Overload类

public class MyTemplate<T1, T2> {
    public T1 Prop1 { get; set; }
    public T2 Prop2 { get; set; }
}

public class MyTemplate<T1> : MyTemplate<T1, string>{}

答案 3 :(得分:8)

C#不支持这样的功能。

正如你所说,你可以将它子类化(如果没有密封,并复制所有构造函数声明),但这是完全不同的事情。

答案 4 :(得分:2)

不幸的是,C#不支持您要做的事情。考虑到参数的默认类型必须遵守通用约束,并且当CLR试图确保类型安全时,很可能会产生令人头疼的问题,这将是一个难以实现的功能。