【发布时间】:2010-10-09 07:03:01
【问题描述】:
我试图将类上的集合属性标记为已过时,以查找所有出现的情况并在我的警告列表中保留要修复的缩小列表,因为我们需要用其他东西替换此集合属性.
编辑:我已通过 Microsoft Connect 提交此内容,issue #417159。
Edit 16.11.2010:验证现在在为 .NET 3.5 和 4.0 编译时,这在 C# 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
}
}
}
【问题讨论】:
-
我已将您的“连接”标记为已验证并给它评分...
-
顺便说一句,我预计不会在 C# 4.0 之前修复;代码会在 2.0 中编译吗?也许试试 2.0 编译器...
-
不,我们会做的,我只是在尝试使用 ObsoleteAttribute 作为获取“待办事项”列表的快速方法时偶然发现的,以便在我们继续重构之前修复要修复的事情.
标签: c# properties obsolete