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

时间:2015-02-09 12:25:53

标签: c# lambda

在下面的代码中,编译器显然无法确定" 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"包围类名时,我没有意识到我创建了一个实例数组。 错误信息被我误解为"你没有声明,我不知道"而不是"你必须在""之后使用Type,而不是类型实例"。

我非常感谢通过示例和替代方案快速响应。希望我能在Stackoverflow网站上为其他人提供帮助: - )

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

它是你。编译器告诉你这个问题。您没有遵循语法,即

someInstance is ClassName

你不能这样做:

someInstance is typeof(ClassName)

你可以这样做:

someInstance.GetType() == typeof(ClassName)

答案 2 :(得分:1)

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()));