これは、仕様Bound and Unbound Typesのセクション 4.4.3 で概説されているように、C# 言語では許可されていません。
制約がコンストラクターの constraintnew()
である場合、型はパラメーターなしのパブリック コンストラクターであってはA
ならず、それを持っている必要があります。abstract
これは、次のいずれかが真の場合に満たされます。
A
すべての値型にはパブリックの既定のコンストラクターがあるため、値型です。
A
コンストラクタ制約を持つ型パラメータです
A
値型制約を持つ型パラメーターです
A
パラメータなしでabstract
明示的に宣言されたコンストラクタを含んでいないクラスです。public
A
ではなくabstract
、デフォルトのコンストラクターがあります。
これらの条件のいずれかが満たされない場合、コンパイラ エラーが発生します。public であるが内部コンストラクターのみを持つ型があることに気付いた場合、ほとんどの場合、それらは実際には public コンストラクターを持つ内部型である必要があります。
型アクセサーを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;
}
}
要件に合わせて設計できない場合、ジェネリックは適していない可能性があります。ジェネリックでできることは限られており、すべての問題を解決できるわけではありません。Factory Pattern、インジェクションなどがあります。