それに直面して、私はいくつかの問題を見ることができます。
- コードはコンパイルされませんが、それを無視してコンパイルさせることができます。
- コードはあなたが思っていることをしません。
説明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つすべてに名前を付けることはできなかったと思いますが、コードをより保守しやすくするために変更して、何が問題だったのかを教えてください。それなら私は無意味な面接の質問をするために歩くでしょう。