2015-02-09 92 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()));