是否有为不可能的“OfType”调用生成编译器错误的选项
Is there an option to generate compiler errors for impossible `OfType` calls
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
示例中可能有一个小的性能优势(因为检查总是 return 一个空枚举),但由于 LINQ 是延迟评估的,所以真正的性能优势将非常小,如果有的话;但是要求编译器理解方法的内部工作原理来完成这样的任务,是......非常难以正确实施!编译器,即使是今天非常先进的编译器,也没有学会这样做。
所以,不可能,但那可能没问题。
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
示例中可能有一个小的性能优势(因为检查总是 return 一个空枚举),但由于 LINQ 是延迟评估的,所以真正的性能优势将非常小,如果有的话;但是要求编译器理解方法的内部工作原理来完成这样的任务,是......非常难以正确实施!编译器,即使是今天非常先进的编译器,也没有学会这样做。
所以,不可能,但那可能没问题。