それに直面して、私はいくつかの問題を見ることができます。
- コードはコンパイルされませんが、それを無視してコンパイルさせることができます。
- コードはあなたが思っていることをしません。
説明2:T制約付きのクラス定義で型を指定しますが、次に制約なしのメソッドレベルでIExecutor別の型を定義します。Tこれはコンパイルされません。
これを修正<T>してメソッドから定義を削除すると、警告なしに失敗する理由がいくつかわかります。
ex無効である。
- タイプ
Tには、パブリックパラメーターなしのコンストラクターが定義されていません。
- おそらく、を含むDLLをロードできません
T。
ヤクブが見つけたように:
Tインターフェイス(コンストラクターなし)である可能性があります。
T抽象クラスである可能性がありますが、これらはインスタンスを直接作成することを許可しません。
1つ目は、nullチェックを使用しないif (ex != null)ように保護でき、2つ目は、別のジェネリック制約を使用しないように保護できますnew()。
class Executor2<T> where T : IExecutor, new()
{
}
もちろん、例外ロギングを含めるようにコードを修正することもできます。これは、暗闇の中で刺すのではなく、実際の問題が何であるかを理解するのに役立つ場合があります。
public void Execute<T>()
{
try
{
var ex = (T)Activator.CreateInstance(typeof(T));
ex.Execute();
}
catch (Exception ex)
{
Log(ex); // Mystical logging framework.
throw;
}
}
質問がわからなかったので、これが私が一緒に考えられる唯一の答えです。
インタビューでこれを尋ねられた場合、3つすべてに名前を付けることはできなかったと思いますが、コードをより保守しやすくするために変更して、何が問題だったのかを教えてください。それなら私は無意味な面接の質問をするために歩くでしょう。