我試圖將一個類的集合屬性標記爲Obsolete,以查找所有發生的事件,並在我的警告列表中保留一個縮小的事件列表以解決問題,因爲我們需要用其他事件替換此集合屬性。爲什麼C#集合屬性在調用屬性時沒有被標記爲廢棄?
編輯:我已經通過Microsoft連接,issue #417159提交此。
編輯16.11.2010:已驗證此功能現在可在C#4.0編譯器中使用,無論是在編譯.NET 3.5還是4.0時。在發佈的代碼中,我收到4條警告,其中包括評論爲「不行?」的警告。
然而,出乎我的意料,列表僅包含幾個occurances,遠遠低於我知道有,並且spotchecks告訴我,由於某種原因,財產的用途並不總是標記爲過時由編譯器在警告列表中。
下面是一個例子程序,準備在Visual Studio編譯2008年
注意接近尾聲標有#1-#4,這些四大行,我希望所有的人都向大家報告,使用的屬性已過時,但#3不是,似乎如果直接轉到集合屬性或方法,屬性本身的使用不會被標記爲過時。請注意,#3和#4引用相同的屬性,#4被標記爲使用廢棄的屬性,而#3不是。測試表明,如果在表達式中,我訪問該屬性返回的集合的屬性或方法,編譯器不會發出抱怨。
這是一個錯誤,或者這是一個「隱藏的寶石」的C#編譯器,我不知道?
using System;
using System.Collections.Generic;
namespace TestApp
{
public abstract class BaseClass
{
[Obsolete]
public abstract String Value
{
get;
}
[Obsolete]
public abstract String[] ValueArray
{
get;
}
[Obsolete]
public abstract List<String> ValueList
{
get;
}
}
public class DerivedClass : BaseClass
{
[Obsolete]
public override String Value
{
get
{
return "Test";
}
}
[Obsolete]
public override String[] ValueArray
{
get
{
return new[] { "A", "B" };
}
}
[Obsolete]
public override List<String> ValueList
{
get
{
return new List<String>(new[] { "A", "B" });
}
}
}
public class Program
{
public static void Main(String[] args)
{
BaseClass bc = new DerivedClass();
Console.Out.WriteLine(bc.Value); // #1 - OK
Console.Out.WriteLine(bc.ValueArray.Length); // #2 - OK
Console.Out.WriteLine(bc.ValueList.Count); // #3 - Not OK?
List<String> list = bc.ValueList; // #4 - OK
}
}
}
我打上你的「連接」的驗證,並給它一個評價? – 2009-02-23 10:40:18
順便說一句,我也沒有預料到前一個修復C#4.0 ;代碼將在2.0中編譯?也許試試2.0編譯器... – 2009-02-23 10:46:30
不,我們會做,我只是偶然發現這一點,當試圖使用ObsoleteAttribute作爲一個快速的方式來獲得一個「todo」列表的東西來解決之前,我們繼續前進重構。 – 2009-02-23 10:53:46