Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq的隐式cast_C#_.net_Extension Methods_Linq To Objects - Fatal编程技术网

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()在非空int序列上崩溃;现在还不清楚您是否看到了issueNo,泛型类型推断不是这样工作的。它要么必须推断所有类型,要么必须指定所有类型。@DanielCook这听起来更像是OP需要对无效强制转换进行编译时检查,而
cast
没有这样做。
var mappedIdentifiersString = identifiers.Select(x => (string)x);  // fails at compile time if x is an int.