这两种方法实际上是相同的,但第一种无法编译。我无法弄清楚为什么存在这个限制。
/// <summary>
/// Dynamically loads all document extractors from implementation assemblies into an enumeration
/// </summary>
private static IEnumerable<IDocumentExtractor> EnumerateInstances()
{
IEnumerable<Type> types = EnumerateTypes();
foreach(Type type in types)
{
try
{
IDocumentExtractor extractor = Activator.CreateInstance(type) as IDocumentExtractor;
yield return extractor;
}
catch
{
_log.WarnFormat("Type {0} couldn't be instanced.", type.Name);
}
}
}
以下是可以成功编译的版本:
/// <summary>
/// Dynamically loads all document extractors from implementation assemblies into an enumeration
/// </summary>
private static IEnumerable<IDocumentExtractor> EnumerateInstances()
{
IEnumerable<Type> types = EnumerateTypes();
foreach (Type type in types)
{
IDocumentExtractor extractor = null;
try
{
extractor = Activator.CreateInstance(type) as IDocumentExtractor;
}
catch
{
_log.WarnFormat("Type {0} couldn't be instanced.", type.Name);
}
if (extractor != null)
yield return extractor;
}
}
using
块在 IL 中生成一个try/finally
。它们是等效的。您可以使用 ILDASM 自行查看。 - Dave Black