このコレクション プロパティを別のものに置き換える必要があるため、クラスのコレクション プロパティに Obsolete のフラグを立てて、すべての出現箇所を見つけ、警告リストに修正すべきものの縮小リストを保持しようとしました。
編集: Microsoft Connect を通じてこれを送信しました。問題番号 417159です。
編集 16.11.2010 : .NET 3.5 および 4.0 用にコンパイルする場合の両方で、これが C# 4.0 コンパイラで機能することを確認しました。投稿されたコードに、「Not OK?」というコメントを含む 4 つの警告が表示されます。
しかし、驚いたことに、リストにはいくつかの出現しか含まれていませんでした。私が知っていたよりもはるかに少なく、spotchecks は、何らかの理由で、警告リストでコンパイラによってプロパティの使用が常に廃止されているとフラグ付けされていないことを示しています。 .
Visual Studio 2008 でコンパイルできるサンプル プログラムを次に示します。
これらのうち、#1 から #4 でタグ付けされた末尾近くの 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
}
}
}