从表面上看,我可以看到一些问题。
- 该代码无法编译,但我可以忽略它并使其编译。
- 代码没有做你认为的事情。
解释 2:您T
在类定义中指定了一个带有约束的类型IExecutor
,但是您随后T
在没有约束的方法级别定义了另一个类型。这不编译。
如果我解决这个问题并<T>
从方法中删除定义,我可以看到它失败的许多原因而没有太多警告:
ex
一片空白。
- 类型
T
没有定义公共无参数构造函数。
- 也许它无法加载包含
T
.
正如 Jakub 所发现的:
T
可能是一个接口(没有构造函数)。
T
可能是一个抽象类,这些不允许直接创建实例。
第一个可以防止使用空检查if (ex != null)
,第二个可以防止使用另一个通用约束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 个,但我知道如何更改代码以使其更易于维护并告诉我出了什么问题。然后我很可能会因为问一些毫无意义的面试问题而走路。