C# 语言不允许这样做,如规范绑定和未绑定类型第 4.4.3 节所述。
如果约束是构造函数约束new(),则类型A不能是abstract,并且必须有一个公共的无参数构造函数。如果满足以下条件之一,则满足此条件。
-
A 是一个值类型,因为所有值类型都有一个公共的默认构造函数
-
A 是具有协程约束的类型参数
-
A 是具有值类型约束的类型参数
-
A 是一个不是 abstract 的类,它包含一个显式声明的 public 构造函数,没有参数
-
A 不是 abstract 并且有一个默认构造函数。
如果不满足其中任何一个条件,则会出现编译器错误。如果您发现自己的类型是公共的,但只有内部构造函数,那么它们很可能实际上应该是具有公共构造函数的内部类型。
我建议将您的类型访问器更改为internal,并将其构造函数更改为public,并使其无参数。然后,您的 public 无参数构造函数可以调用非无参数 private 或 internal 构造函数来执行任何额外的初始化工作。
internal class C<T> where : T new()
{
public C() : this(new T()) {
}
private C(T t) {
// Do additional initialization
}
}
请注意,该模式是有限的,但没有什么能阻止您改用 private 方法。
internal class C<T> where T : new() {
public C() {
T t = new T();
InitializeClass(t);
}
private void InitializeClass(T t) {
throw new NotImplementedException();
}
}
根据您的更新,这是一个公共单身模式的小示例。
public class Singleton<T> where T : new()
{
public static Singleton<T> Current {
get;
private set;
}
internal Singleton() : this(new T()) {
}
private Singleton(T t) {
Current = this;
// Do whatever you need to with T
}
public String Name {
get;
set;
}
}
用法
// Somewhere in your internal assembly
Singleton<String> singleton = new Singleton<String>();
// In an external assembly
Singleton.Current.Name = "SoMoS";
您甚至不需要以这种方式使用构造函数,您可以轻松地做一些简单的事情。
public class Singleton<T> where T : new()
{
public static Singleton<T> Current {
get;
private set;
}
internal Singleton() {
T t = new T();
// Do stuff with T
}
public String Name {
get;
set;
}
}
泛型如果你不能设计它来满足你的要求,它可能不是要走的路。泛型只能做这么多,并不能解决所有问题。有工厂模式、注入等。