C# 使用Linq的隐式cast
假设我有一个包含整数的列表(C# 使用Linq的隐式cast,c#,.net,extension-methods,linq-to-objects,C#,.net,Extension Methods,Linq To Objects,假设我有一个包含整数的列表(var identifiers=Enumerable.Empty()) 使用此列表,我可以将各个项目强制转换为其他类型: var castedIdentifiersLong = identifiers.Cast<long>(); var castedIdentifiersString = identifiers.Cast<string>(); 在这种情况下,不需要的甚至不应该编译,因为int不能隐式地强制转换为string。但另一方面,wan
var identifiers=Enumerable.Empty()
)
使用此列表,我可以将各个项目强制转换为其他类型:
var castedIdentifiersLong = identifiers.Cast<long>();
var castedIdentifiersString = identifiers.Cast<string>();
在这种情况下,不需要的
甚至不应该编译,因为int
不能隐式地强制转换为string
。但另一方面,wanted
应该编译,因为它可以隐式地转换为long
有没有一种方法可以定义一个扩展方法(比如隐式地定义castinully
),在这种方法中,我只能定义两个泛型类型中的一个,它可以从源枚举中找出第一个类型
var unwanted = identifiers.ImplicitCast<string>();
var wanted = identifiers.ImplicitCast<long>();
如果输入是通用的,则不会。编译器无法部分推断泛型参数-您必须指定所有泛型参数或不指定泛型参数,然后让编译器进行推断
即使可以,编译器仍然不允许在泛型类型之间进行隐式转换
如果希望编译器在编译时识别无效的强制转换,可以执行显式强制转换:
var mappedIdentifiersString = identifiers.Select(x => (string)x); // fails at compile time if x is an int.
它可能无法在编译时捕获所有可能的无效强制转换(例如,在编译时始终允许对
对象
进行强制转换),但对于特定的int
到字符串
场景,它确实会失败。您是在谈论TypeOf方法吗?@Valentin否,某些编译时检查的实例,其形式不存在var castedIdentifiersString=identifiers.Cast()如果开始枚举castedIdentifiersString,则代码>在非空int序列上崩溃;现在还不清楚您是否看到了issueNo,泛型类型推断不是这样工作的。它要么必须推断所有类型,要么必须指定所有类型。@DanielCook这听起来更像是OP需要对无效强制转换进行编译时检查,而cast
没有这样做。
var mappedIdentifiersString = identifiers.Select(x => (string)x); // fails at compile time if x is an int.