2015-02-09 61 views
0

在下面的代码中,编译器显然不能确定“t”的正确类型。C#IS运算符不能用于lambda表达式吗?

_supportedElements.Any(t => element is t) 

将鼠标悬停在第二个t之上并没有像往常那样提及类型。编译器给出了一个没有类型或名称空间t的错误。当我更改为

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

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

没有编译器错误,并且还徘徊第二吨以上鼠标正确地指出的类型

_supportedElements被定义为。但我真的需要使用IS运算符。

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


编辑:

所有的回应后,它很清楚,现在的怪癖是在我这里 我的目的是创建一个类型来验证当前的类型与数组。这是不可能的,我没有意识到当我用“typeof”包围类名时,我创建了一个实例数组。 错误消息被我误解为“你没有声明t,我不知道它”,而不是“你必须在”is“之后使用Type,而不是类型实例”。

我真的很感激例子和替代方案的快速反应。希望我会对其他人在Stackoverflow站点有所帮助:-)

+1

为什么你需要使用'is'运营商? – 2015-02-09 12:27:39

+0

什么是'元素'? – Yuck 2015-02-09 12:28:20

+3

因为_supportedElements是一个类型数组,所以is运算符看起来不太可能是你想要的,也就是说它们全都是x是System.Type而不是其他很多其他的 – tolanj 2015-02-09 12:30:51

回答

1

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

其你。编译器告诉你这个问题。你不遵循语法,这是

someInstance is ClassName 

你不能做到这一点:

someInstance is typeof(ClassName) 

,你可以这样做:

someInstance.GetType() == typeof(ClassName) 
2

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

+0

我不这么认为。 https://msdn.microsoft.com/en-us/library/scekt9xw.aspx – EagleBeak 2015-02-09 12:50:37

+0

@EagleBeak,等等? 't'是'System.Type'类型的一个实例,不是一个类型本身。 – aush 2015-02-09 12:53:31

+0

是的,你说得对。抱歉。我误解了你的答案,并认为你提到了“is”关键字本身,而不是他的代码。 – EagleBeak 2015-02-09 14:07:41

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