C# IS 运算符不能用于 lambda 表达式?

C# IS operator cannot be used in lambda expression?

在下面的代码中,编译器显然无法确定 "t" 的正确类型。

_supportedElements.Any(t => element is t)

将鼠标悬停在第二个 t 上并没有像往常一样提及类型。编译器报错没有类型或命名空间t.

_supportedElements 定义为:

private Type[] _supportedElements = { typeof(TextField), typeof(CheckBox), typeof(RadioButton), typeof(SelectList), typeof(TableRow), typeof(Link), typeof(Button) }; 

当我将其更改为:

_supportedElements.Any(t => elementGetType() == t)

没有编译器错误,将鼠标悬停在第二个 t 上方也正确说明了类型。但我真的需要使用IS运算符。

这是 Visual Studio 2013 SP4 还是我自己的怪癖...?


编辑:

在你所有的回复之后,我现在很清楚这个怪癖... 我的意图是创建一个类型数组来验证当前类型。这是不可能的,当我用 "typeof" 包围类名时,我没有意识到我创建了一个实例数组。 错误消息被我误解为 "You did not declare t, I don't know it" 而不是 "you must use a Type after "is", not a type instance".

我非常感谢您对示例和备选方案的快速响应。希望我能对 Whosebug 网站上的其他人有所帮助:-)

您正在检查一个实例是否 is 另一个实例,而不是类型。

var element = new MyType();

Type[] _supportedElements = { typeof(MyType), typeof(int), typeof(string)};

// True
var isAcceptedType = _supportedElements.Any(t => t.IsAssignableFrom(element.GetType()));

var notSupportedElement = 'a';

// False
isAcceptedType =  _supportedElements.Any(t => t.IsAssignableFrom(notSupportedElement.GetType()));

这是 Visual Studio 2013 SP4 还是我自己的怪癖...?

是你。编译器告诉你问题所在。您没有遵循

的语法
someInstance is ClassName

你不能这样做:

someInstance is typeof(ClassName)

你可以这样做:

someInstance.GetType() == typeof(ClassName)