在代碼中只存在一種實現IResourceConverter的類型。這就是以下兩條linq聲明所要查找的內容。前者找不到它。後者的確如此。但是它們都是等效的語法(或者至少應該是!)。linq拼圖...等效的語法...不等效的結果!
LINQ的聲明1:
List<Type> toInstantiate = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.Where(type => typeof(IResourceConverter).IsAssignableFrom(type)
&& type != typeof(IResourceConverter))
.ToList();
這將返回0的結果。
LINQ的聲明2:
我已經離開了LINQ除了where子句中,這是我爆發了,並用foreach循環
List<Type> toInstantiate = new List<Type>();
List<Type> allTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.ToList();
foreach (Type t in allTypes)
{
if (typeof(IResourceConverter).IsAssignableFrom(t)
&& t != typeof(IResourceConverter))
toInstantiate.Add(t);
}
在這種情況下做了相當的toInstantiate有1個結果不變......正是我所期望的。
這種奇怪的行爲的任何解釋?
我假設toInstantiate中的1結果確實實現了IResourceConverter?您可能想要添加/澄清一些事實......在上下文不明確的情況下。 – jrista 2009-09-04 18:53:45
對不起,jrista。是的,存在一種實現IResourceConverter的類型。這就是linq聲明正在尋找的。前者找不到它。後者的確如此。但是它們似乎都是等效的語法。 – Daniel 2009-09-04 18:56:51
我注意到這也發生,如果你仍然使用linq,但保持獨立的地方,並從allTypes查詢它。 – 2009-09-04 18:58:26