我有一个带有隐式转换运算符到大多数基本类型的类型,并尝试使用 .Cast<string>()
在这种类型的集合上,失败了。当我深入研究它时,我注意到通过 as
类型转换不使用隐式或显式转换,只是不会编译,所以我想这就是 .Cast
的地方摔倒。所以这失败了
var enumerable = source.Cast<string>();
但这行得通
var enumerable = source.Select(x => (string)x);
那么 Cast 有什么好处呢?当然,它短了几个字符,但似乎更受限制。如果可以用来转换,除了语法更紧凑之外还有什么好处吗?
最佳答案
转换用法
Cast
的好处|当您的收藏仅实现 IEnumerable
时出现(即不是通用版本)。在这种情况下,Cast
将所有元素转换为 TResult
通过类型转换,并返回IEnumerable<TResult>
.这很方便,因为所有其他 LINQ 扩展方法(包括 Select
)仅针对 IEnumerable<T>
声明.在代码中,它看起来像这样:
IEnumerable source = // getting IEnumerable from somewhere
// Compile error, because Select is not defined for IEnumerable.
var results = source.Select(x => ((string)x).ToLower());
// This works, because Cast returns IEnumerable<string>
var results = source.Cast<string>().Select(x => x.ToLower());
Cast
和 OfType
是为 IEnumerable
定义的仅有的两个 LINQ 扩展方法. OfType
像Cast
一样工作, 但跳过不属于 TResult
类型的元素而不是抛出异常。
强制转换和隐式转换
当您使用 Cast
时,您的隐式转换运算符 不起作用的原因很简单:Cast
Actor object
至 TResult
- 并且您的转换未针对 object
定义,仅适用于您的特定类型。 Cast
的实现是这样的:
foreach (object obj in source)
yield return (TResult) obj;
执行转换的这种“失败”对应于基本转换规则 - 如本例所示:
YourType x = new YourType(); // assume YourType defines an implicit conversion to string
object o = x;
string bar = (string)x; // Works, the implicit operator is hit.
string foo = (string)o; // Fails, no implicit conversion between object and string
关于c# - .Cast 优于 .Select 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132500/