簡體   English   中英

這是一個C#4.0編譯器可選參數bug嗎?

[英]Is this an C# 4.0 compiler optional parameters bug?

我正在編寫自定義安全屬性並得到奇怪的編譯器行為...當我在同一文件中使用該屬性時,默認參數值工作正常:

using System.Security.Permissions;

[System.Serializable]
sealed class FooAttribute : CodeAccessSecurityAttribute {
    public FooAttribute(SecurityAction action = SecurityAction.Demand) : base(action) { }
    public override System.Security.IPermission CreatePermission() { return null; }
}

[Foo] class Program {
    static void Main(string[] args) { }
}

但是當我將上面的代碼分成兩個文件時 - 文件1:

using System.Security.Permissions;

[System.Serializable]
sealed class FooAttribute : CodeAccessSecurityAttribute {
    public FooAttribute(SecurityAction action = SecurityAction.Demand) : base(action) { }
    public override System.Security.IPermission CreatePermission() { return null; }
}

和文件2:

[Foo] class Program {
    static void Main(string[] args) { }
}

我有一個編譯器錯誤:

錯誤:'FooAttribute'不包含帶0參數的構造函數

這只發生在CodeAccessSecurityAttribute繼承者身上,看起來很奇怪......

所以我沒有一個確切的答案,但我盡可能地調查它。 我想我明白為什么當你繼承CodeAccessSecurityAttribute而不是SecurityAttribute.時會發生這種情況SecurityAttribute. 如果您查看從CodeAccessSecurityAttribute繼承時應用Foo屬性時生成的IL,它看起來像這樣:

.permissionset demand = {class 'ConsoleApplication1.FooAttribute, ConsoleApplication1, Version=1.0.0.0, Culture=neutral' = {}}

Foo繼承自SecurityAttribute時,它看起來像這樣:

.custom instance void ConsoleApplication1.FooAttribute::.ctor(valuetype [mscorlib]System.Security.Permissions.SecurityAction) = ( 01 00 02 00 00 00 00 00 ) 

顯然,CodeAccessSecurityAttribute通過應用屬性大大改變了生成的IL。

如果我們將Foo聲明更改為如下,則更多地查看IL

[Foo(SecurityAction.Demand)]

我們得到以下IL:

.permissionset demand = {class 'ConsoleApplication1.FooAttribute, ConsoleApplication1, Version=1.0.0.0, Culture=neutral' = {}}

它與我們沒有指定可選參數時的情況相同。 此外,我們不僅可以通過將屬性和Program類拆分為單獨的文件來導致錯誤,我們可以通過重新排列類中的文件來導致它,如下所示:

[Foo]
class Program
{

    static void Main(string[] args) {}


}

[System.Serializable]
sealed class FooAttribute : CodeAccessSecurityAttribute
{
    public FooAttribute(SecurityAction action = SecurityAction.Demand) : base(action) { }
    public override System.Security.IPermission CreatePermission() { return null; }
}

如果我們使用類別OtherOther2執行以下操作會更有趣,但是Program沒有。 只有文件中Foo之前的類才會出錯

 [Foo]
 class Other
 {

 }

 [Foo]
 class Other2
 {
 }

 [System.Serializable]
 sealed class FooAttribute : CodeAccessSecurityAttribute
 {
      public FooAttribute(SecurityAction action = SecurityAction.Demand) : base(action) { }
      public override System.Security.IPermission CreatePermission() { return null; }        }

 [Foo]
 class Program
 {

  static void Main(string[] args) {}
 }

這對我說的是構建過程中的某個地方存在問題。 我不太了解Code Access Security如何解決確切問題。 必須有部分過程查看CodeAccessSecurityAttributes並嘗試將SecurityAction應用於代碼。 我假設它為程序集構建了某種元數據。 它必須以某種有序的方式執行此操作,以便在它已經通過Program類之后才會看到可選參數。 然后,它必須在構建過程中以某種方式使用該元數據,這是您看到失敗的地方。 對於任何更多的細節,我們必須希望有人知道編譯器,即埃里克可以闡明它。 我會在connect.microsoft.com上提交它作為建議的評論之一,因為它似乎是由於遍歷訂單而導致的錯誤。

暫無
暫無

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

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