【发布时间】:2015-12-01 14:23:41
【问题描述】:
假设我有一个整数列表 (var identifiers = Enumerable.Empty<int>())。
使用此列表,我可以将单个项目转换为另一种类型:
var castedIdentifiersLong = identifiers.Cast<long>();
var castedIdentifiersString = identifiers.Cast<string>();
我们可以使用Select<TSource, TTarget>() 来使用隐式转换:
var mappedIdentifiersLong = identifiers.Select<int, long>(x => x);
var mappedIdentifiersString = identifiers.Select<int, string>(x => x);
显然最后一条语句失败了,因为int 不能隐式转换为string。这是故意的。
有没有一种方法可以定义扩展方法(比如CastImplicitly<T>),我只能定义两个泛型类型中的一个,它会从源可枚举中找出第一个类型?
var unwanted = identifiers.ImplicitCast<string>();
var wanted = identifiers.ImplicitCast<long>();
在这种情况下,unwanted 甚至不应该编译,因为 int 不能隐式转换为 string。但另一方面,wanted 应该可以编译,因为它可以隐式转换为 long。
【问题讨论】:
-
你说的是TypeOf方法吗?
-
@Valentin 不,在这个表单中不存在一些编译时检查
-
var castedIdentifiersString = identifiers.Cast<string>();在非空 int 序列上崩溃,如果您开始枚举castedIdentifiersString;目前尚不清楚您是否看到该问题 -
不,这不是泛型类型推断的工作原理。它要么必须推断所有类型,要么必须指定所有类型。
-
@DanielCook 听起来更像是 OP 想要在编译时检查
Cast不做的无效转换。
标签: c# .net extension-methods linq-to-objects