2012-05-04 89 views
4

我正在處理屬性。我經常遇到錯誤'屬性參數必須是常量表達式,類型表達式或屬性參數類型的數組創建表達式'。我真的不知道「常量表達」的含義。c#:什麼是常量表達式?

如果能夠將Func<MyType, bool>傳遞給屬性(由屬性存在時執行的代碼使用)將會非常有用。但是,唉,不。我不明白爲什麼這種類型不能放入程序集元數據中,我認爲這是我無法將它傳遞給屬性的原因。

誰能給我任何想法?

回答

3

編譯器需要能夠創建在編譯時的屬性,因爲它們嵌入在裝配與他們的實際數據(它們是由編譯器實例化和序列化到輸出文件)。這就是爲什麼你需要一個不斷的表達。

基本上你可以使用所有的基本數據類型(如int,bool,string等)。您還可以使用typeof表達式,因爲它們將被解析爲標識類型的元數據令牌,這在編譯時很正常。

也許你可以把你的Func<MyType, bool>的理念融入到你的類型實現的接口。或者通過使用typeof(MyHandlerClass)表達式將其傳遞給屬性的單獨處理程序類中。

+0

這基本上是一個代表,我在下面建議。 – Styxxy

2

屬性在C#編譯時文物,所以爲了創建他們必須有一個恆定的參數/標記/什麼...

有可能嘗試做什麼你來了,我想,要做到:

Dynamic Attributes in C#

+0

感謝您一個非常有趣的環節。 – David

7

常量表達式的值在編譯時書確定,包括其他常量表達式的字符串連接,算術等

因此,例如,「」是一個常量表達式,但String.Empty不是。

String是唯一的參考類型以支持一個非空的常量表達式。對於值類型,原始類型(int等)和decimal支持常量表達式......雖然你不能在屬性使用decimal,因爲它不是在CLR原始。 (您甚至不能在屬性構造函數中指定decimal作爲參數類型。)

有關更多信息,請參閱C#4規範的第7.19節。

+0

不允許使用「decimal」。更多在這裏:https://docs.microsoft。com/en-us/dotnet/csharp/misc/cs0182 – tomwesolowski

+0

@tomwesolowski:已編輯,儘管說出您所指的內容會有幫助。 –

相關問題