簡體   English   中英

通過將默認字符串參數傳遞給屬性導致的C#編譯器錯誤

[英]C# Compiler error caused by passing default string parameter to attribute

為什么下面的代碼給我例外:

CSC錯誤CS0182:屬性參數必須是屬性參數類型的常量表達式,typeof表達式或數組創建表達式

在我的構建服務器上?

/// Customer.cs...

[Search(SearchAttribute.SearchDisplay.Regular)] 
public Category Category
{
     get; set;
}

public enum Category : byte
{
    X = 0x01,
    Y = 0x02,
    ...
}

/// SearchAttribute.cs...

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SearchAttribute : Attribute
{
    public SearchDisplay Display { get; private set; }

    public enum SearchDisplay
    {
        None = (byte) 0x01,
        Regular = (byte) 0x02
    }

    public SearchAttribute(SearchDisplay display, string columnName = null)
        : base()
    {
        Display = display;
    }
}

非常感謝。

令人憤怒的是,它在VS2012中可以正常運行。 我不確定服務器上運行的是哪個版本的編譯器-但我很確定它不是2012版本。

UPDATE

感謝下面的回答者,我已經弄清楚了:

我正在使用VS2012,但是構建服務器仍在使用VS2010構建過程。 在屬性中使用空值默認參數時,VS2010 / C#4編譯器中會出現一個錯誤 我可以通過以下三種方法解決:

  1. 不要使用默認參數- public SearchAttribute(SearchDisplay display, string columnName)
  2. 使用空字符串-公共SearchAttribute(SearchDisplay顯示,字符串columnName =“”)
  3. 更新我的構建服務器。

我現在要和2一起去。 3是我以后需要考慮的問題。

我認為Customer.cs文件位於單獨的程序集(C#項目)中,並且該程序集引用SearchAttribute.cs所在的程序集(項目)。

為了使構造函數中的枚舉SearchDisplay和可選參數columnName能夠正常工作,至關重要的是, 兩個程序集必須以正確的順序重新編譯。 我懷疑構建服務器上的情況並非如此。 依賴程序集可能是通過引用SearchAttribute所在程序集的舊版本進行編譯的。

UPDATE

查看右側所有鏈接的線程。 他們說這是Visual Studio 2012(C#5編譯器)已修復的錯誤。 僅當可選參數的默認值為null時,它才會發生。 在我的第一個測試中,我做出了使用另一個字符串(可以識別)的愚蠢決定,但是對於另一個字符串卻沒有發生。 (將在下面刪除我的評論。)

當屬性的用法與屬性類本身在同一程序集中時,這有助於為null文字提供顯式類型,例如:

public SearchAttribute(SearchDisplay display, string columnName = (string)null)
...

這樣,只要所有用法與上述構造函數都在同一程序集中,就可以正常工作。 但是,在您的情況下,它們位於不同的程序集中。

如果您願意使用空字符串代替,問題就解決了:

public SearchAttribute(SearchDisplay display, string columnName = "")
...

否則,建議您使用舊的C#-4-以前的樣式

[Search(SearchAttribute.SearchDisplay.Regular)] 
public Category Category
...

[Search(SearchAttribute.SearchDisplay.Regular, ColumnName = "Changed!")] 
public Category AnotherCategory
...

只要有一個名為ColumnName的類成員(實例屬性或字段),此構造函數在構造函數中就不會使用columnName參數。 ColumnName不得為只讀或僅獲取。

你不是說

 [Search(SearchAttribute.SearchDisplay.Regular)] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM