gpt4 book ai didi

c# - 转换为自定义类型、Enumerable.Cast 和 as 关键字

转载 作者:行者123 更新时间:2023-11-30 20:51:31 26 4
gpt4 key购买 nike

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

经常在代码中处理 AD 时,我发现我必须检查 null、Count、[0] 的值......无论如何并转换我得到的东西......一直希望底层 AD 对象通过COM 不会发出声音等。

最近玩了玩 Parallel.ForEach - 并且不得不传入 IEnumerable<T> 之后,我想,看看我如何将 SearchResultCollection 转换为我自己的自定义类型的 IEnumerable 可能会很有趣。在这种类型中,我将从 SearchResult 对象中提取所有值,并将它们粘贴到我自己的 .NET 托管代码中。然后我会取消 DirectoryEntryDirectorySearcher 等等。

因此,在已经确定执行 searchResultCollection.Cast() 以便为 Parallel.ForEach 提供其源代码是一个好主意之后,我添加了一个显式运算符用于转换为我自己的类型(我们就称它为“Item” ').

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

好时光,我的类型转换运算符(operator)被调用并且一切正常。然后我想,做类似 searchResultCollection.Cast<Item>() 的事情会很好。遗憾的是,这没有用,没有在转换运算符中遇到任何断点。

我做了一些谷歌搜索并发现了 Jon Skeet 回答的一个有用的帖子:

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”不调用任何转换运算符.. 使用 (cast)。从语义上讲,我觉得这有点奇怪,因为扩展方法被称为 cast.. 不应该是 cast 吗?毫无疑问,这不会发生的一个很好的理由,有人知道它是什么吗?

最佳答案

即使它会使用强制转换运算符而不是 as,它仍然不会调用用户定义的显式运算符,所以这无关紧要。唯一的区别是抛出的异常类型。

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com