所以这就是我想要做的。where子句在C#中的构造函数?
我正在创建一个泛型类,该泛型类以两种方式之一分配由泛型参数指定的类型,这由使用的重载构造函数决定。
这里是例如:
class MyClass<T>
where T : class
{
public delegate T Allocator();
public MyClass()
{
obj = new T();
}
public MyClass(Allocator alloc)
{
obj = alloc();
}
T obj;
}
这类需要类型T是在所有情况下RefType的。对于默认的构造函数,我们想通过默认的构造函数实例化T。我想放where T : new()
我的默认构造函数,像这样:
public MyClass()
where T : new()
{
obj = new T();
}
然而,这不是有效的C#。基本上我只想添加对T类型的约束,只有在使用MyClass()的默认构造函数时才有默认构造函数。
在MyClass的第二个构造函数中,我们让用户决定如何用自己的分配方法为T分配,所以很明显,MyClass在所有情况下都不强制默认构造。
我有一种感觉,我需要在默认的构造函数中使用反射,但我希望不会。
我知道这可以这样做,因为.NET 4.0中的Lazy<T>
类不要求T在类级别默认构造,但它具有类似于我的示例中的构造方法。我想知道Lazy<T>
至少如何。
改变我对这个的答案......我在'Activator.CreateInstance()'上做了一些阅读,事实上它不会在编译时检查默认构造(我更喜欢)。我去了泛型工厂类。 –
2011-05-12 13:44:08
如何在不使用'partial'关键字的情况下两次定义MyClass?我不熟悉这个语法。 – 2011-05-13 14:36:29
@Robert Dailey:我还没有声明MyClass两次 - 我声明了MyClass(非泛型)和MyClass(泛型只有一个类型参数)。它们是不同的类型,就像'Nullable'和'Nullable'是不同的类型。 –
2011-05-13 14:41:04