Я попытался пометить свойство коллекции в классе как устаревшее, чтобы найти все вхождения и сохранить сокращенный список вещей, которые нужно исправить в моем списке предупреждений, из-за того, что нам нужно заменить это свойство коллекции чем-то другим .
Редактировать : я отправил это через Microsoft Connect, выпуск # 417159 .
Редактировать 16.11.2010 : Проверено, что теперь это работает в компиляторе C # 4.0, как при компиляции для .NET 3.5 и 4.0. Я получил 4 предупреждения в опубликованном коде, в том числе с комментарием «Не в порядке?».
Однако, к моему удивлению, список содержал только несколько случаев, гораздо меньше, чем я знал, и выборочные проверки говорят мне, что по какой-то причине использование свойства не всегда помечается компилятором как устаревшее список предупреждений.
Вот пример программы, готовой к компиляции в 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
}
}
}