问题描述
当某些类型的强制类型转换无法进行时,例如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的评估是懒惰的,所以实际的性能收益将非常小(如果有);但是要求编译器了解该方法的内部工作原理以……难以正确实现!编译器,即使是今天真正高级的编译器,都还没有学会这样做。
所以,不可能,但这可能没事。