ジェネリック型を初期化します。Cannot create an instance of the variable type 'Item' because it does not have the new() constraintが非空のコンストラクタとその質問への参照
を私は非空のコンストラクタを持つジェネリック型からインスタンスを作成したいと思います。
'B' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'C.validate(int)'
質問1:なぜ私は唯一のパラメータなしのコンストラクタを使用することができ、私はB b = validate<B>(42);
を呼び出そう
public class A{};
public class B
{
public B(int){/*...*/}
}
public class C
{
public static T validate<T>(int index)
where T : A,
new(int) //error
{
if(/*validation*/)
return null;
return new T(index);
}
}
私はこのエラーを得ましたか。
質問2:デリゲートやインターフェイスなしで問題を解決するにはどうすればよいですか? (私は常に幻想的な解決策を探しています)
質問1への回答は簡単です:[まだ作成されていません](https://github.com/dotnet/roslyn/issues/2206)。これはC#の制限ではありません。 CLR自体はそのような制約をサポートしておらず、可能にするために拡張する必要があります。 (int、int、int、bool、int、bool)を想像してみてください。これはあなたのものの1つの形式を満たすかもしれません。そのコンストラクタが何をすべきかを理解することを幸運にしています。 –
単純な修正は 'new()'制約を使い、デフォルトのコンストラクタ(add)を使うことです。次に、 'Index'プロパティを使用します。' public static T validate(int index) T:A、new() { if(検証) を返します。 T t = new T(); t.Index = index; return t; } 'それ以外の場合は、[ここ](https://stackoverflow.com/a/15003163/284240)のようなActivator.CreateInstanceを使用することができます –
良いニュース - 彼らはそれを構築することはできません。この記事を参照してください:https://github.com/dotnet/csharplang/issues/769。このポストには、可能な解決策/回避策も含まれています。 – Mafii