[英]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; }
}
如果我們使用類別Other
和Other2
執行以下操作會更有趣,但是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.