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

C# 是否有选项为不可能的'OfType'调用生成编译器错误,c#,linq,roslyn,compiler-warnings,C#,Linq,Roslyn,Compiler Warnings,当某些类型强制转换不可能时,VisualStudio能够向用户发出警告,如下所示 公共类A{} 公共类B{} // ... var x=新的A(); //例1 变量y=(B)A;//编译器错误CS0030 //例2 if(x是B)//编译器警告CS0184 我已经查找过了,但是找不到任何类似的编译时检查可用于类型为的LINQ 公共类A{} 公共类B{} // ... var x=新列表?这不可能作为一般解决方案(但是可以为特定情况编写自定义分析器,例如您的类型示例) 不过也没必要。第一个示例中

当某些类型强制转换不可能时,VisualStudio能够向用户发出警告,如下所示

公共类A{}
公共类B{}
// ...
var x=新的A();
//例1
变量y=(B)A;//编译器错误CS0030
//例2
if(x是B)//编译器警告CS0184
我已经查找过了,但是找不到任何类似的编译时检查可用于类型为的LINQ

公共类A{}
公共类B{}
// ...

var x=新列表?

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

不过也没必要。第一个示例中的编译器错误阻止运行时
InvalidCastException
,第二个示例中的警告表示一个谓词总是
false
,因此该
if
语句中的任何代码都是不可访问的-通常不是目的

type
调用的
不存在运行时失败的可能性。虽然在您的
of type
示例中可能存在较小的性能优势(因为检查将始终返回空枚举),但由于LINQ是惰性评估的,因此实际的性能优势非常小(如果有的话);但是,要求编译器理解方法的内部工作机制来完成这样的任务,是非常难正确实现的!编译器,即使是今天非常先进的编译器,也没有学会这样做


因此,这是不可能的,但这可能是可以的。

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

不过也没必要。第一个示例中的编译器错误阻止运行时
InvalidCastException
,第二个示例中的警告表示一个谓词总是
false
,因此该
if
语句中的任何代码都是不可访问的-通常不是目的

type
调用的
不存在运行时失败的可能性。虽然在您的
of type
示例中可能存在较小的性能优势(因为检查将始终返回空枚举),但由于LINQ是惰性评估的,因此实际的性能优势非常小(如果有的话);但是,要求编译器理解方法的内部工作机制来完成这样的任务,是非常难正确实现的!编译器,即使是今天非常先进的编译器,也没有学会这样做


所以,这是不可能的,但这可能没问题。

必须是定制的,这似乎要求编译器知道类型
是如何工作的,而不是将其视为任何其他方法。您可能需要定制分析器。虽然可能与此无关,但这个问题仍然适用于其他一些LINQ方法,类型为
用于从集合中过滤不相关的元素Good point@BACON感谢您指出这一点。我希望在没有内置东西的情况下,有人可能知道类似的东西,但你的观点很好。这必须是自定义的,似乎需要编译器知道类型的
如何工作,而不是将其视为任何其他方法。你可能需要自定义分析器。虽然可能与此无关,但这个问题仍然适用于其他一些LINQ方法,类型为
用于从集合中过滤不相关的元素Good point@BACON感谢您指出这一点。我希望在没有内置东西的情况下,有人可能知道类似的东西,但你提出了一个很好的观点。我不确定是否有人已经写过这样的东西。@JasonMalinowski yep,这在我的回答中提到:)注意,C#编译器支持分析器,有人可以明确地告诉它类型,并为此添加一个错误。我不确定是否有人已经写过这样的东西。@JasonMalinowski是的,这在我的回答中提到:)