是否有可能为不可能的OfType调用生成编译器错误的选项

问题描述

当某些类型的强制类型转换无法进行时,例如Visual Studio,Visual Studio能够警告用户

public class A{}
public class B{}

// ...

var x = new A();

// example 1
var y = (B)A; // Compiler Error CS0030

// example 2
if(x is B) // Compiler warning CS0184

我看过了,但是找不到LINQ OfType<T>运算符可用的类似编译时检查。

public class A{}
public class B{}

// ...

var x = new List<A>();
var y = x.OfType<B>(); // NO problem

有人知道是否已经存在某些东西,还是需要将其实现为custom compiler warning

解决方法

这不可能作为一般解决方案(尽管可以为特定情况编写自定义分析器,例如您的OfType示例)。

虽然也没有必要。第一个示例中的编译器错误阻止运行时InvalidCastException,在第二个示例中,警告指示谓词始终为false,因此该if语句中的任何代码均不可访问-通常不是目的。

OfType调用不可能发生运行时故障。尽管在您的OfType示例中可能会有次要的性能收益(由于检查总是返回空的枚举),但是由于LINQ的评估是懒惰的,所以实际的性能收益将非常小(如果有);但是要求编译器了解该方法的内部工作原理以……难以正确实现!编译器,即使是今天真正高级的编译器,都还没有学会这样做。

所以,不可能,但这可能没事。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...