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