这是出于好奇而不是出于必要的问题,并且是不得不处理诸如SearchResultCollection(在System.DirectoryServices名称空间中)之类的Active Directory(MS)类型的问题。

通常,在代码中处理AD时,我发现我必须检查null,Count,[0] ..的值,然后转换我得到的结果..一直希望通过COM进行底层AD对象不会。不要po等

在最近玩过Parallel.ForEach并必须传递IEnumerable<T>之后,我想,看看如何将SearchResultCollection转换为自己的自定义类型的IEnumerable也许会很有趣。在这种类型中,我将从SearchResult对象中提取所有值,并将其粘贴在我自己的.NET托管代码中。然后我将取消DirectoryEntryDirectorySearcher等。

因此,已经知道为提供Parallel.ForEach的源而执行searchResultCollection.Cast()是一个好主意,我添加了一个显式运算符以强制转换为自己的类型(我们将其称为“ Item” )。

我在ParallelForEachvar myItem = (Item)currentSearchResult中对此进行了测试。

好时机,我的演员操作员被叫来并且一切正常。然后我想,做类似searchResultCollection.Cast<Item>()的事情会很好。不幸的是,这没有用,在转换运算符中没有遇到任何断点。

我做了一些谷歌搜索,发现了一个有用的帖子,乔恩·斯基特回答了:

IEnumerable.Cast<>

症结所在,使用.Select(...)强制执行显式强制转换操作。好的,但是,嗯。

我离开并可能反汇编了System.Core-> System.Linq.Enumerable.Cast<TResult>,我注意到此“ cast”实际上是在幕后进行“ as”关键字转换:

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
{
    IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
    if (enumerable != null)
    {
        return enumerable;
    }
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    return CastIterator<TResult>(source);
}


我读了更多,发现了这一点:

Implicit/Explicit conversion with respect to the "as" keyword

此处的最高答案指出,“ as”不调用任何转换运算符..使用(强制转换)。从语义上来说,我发现这有点怪异,因为扩展方法称为强制转换。它不应该强制转换吗?毫无疑问,这确实是一个很好的理由,为什么任何人都不会知道呢?

最佳答案

即使它使用了强制转换运算符而不是as,它也不会调用用户定义的显式运算符,因此这无关紧要。唯一的区别是引发异常的类型。

在运行时根本不知道显式运算符。根据CLR,无法将搜索结果强制转换为Item。当编译器注意到存在与给定显式运算符匹配的强制转换时,它将在编译时将对该显式运算符的调用(基本上是静态方法)注入代码中。一旦进入运行时,就不会剩下任何有关转换的知识,只需使用一个方法调用即可处理转换。

因为这是显式运算符的实现方式,而不是向运行时提供如何进行转换的知识,所以Cast无法将显式运算符的调用注入代码中。它已经被编译了。当编译它时,不知道要插入任何显式运算符,因此没有注入。

关于c# - 强制转换为自定义类型Enumerable.Cast <T>和as关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21607387/

10-12 17:47
查看更多