我试图将类上的集合属性标记为已过时以查找所有出现的事件并在我的警告列表中保留要修复的缩小列表,因为我们需要用其他东西替换这个集合属性.
编辑:我已通过 Microsoft Connect 提交,issue #417159 .
编辑 16.11.2010:已验证这现在可以在 C# 4.0 编译器中运行,无论是针对 .NET 3.5 还是 4.0 进行编译。我在发布的代码中收到 4 条警告,包括注释为“不正常?”的警告。
然而,令我惊讶的是,该列表只包含了一些事件,比我知道的要少得多,并且抽查告诉我,出于某种原因,该属性的使用并不总是被编译器标记为过时警告列表。
这是一个示例程序,可以在 Visual Studio 2008 中编译。
请注意末尾附近标有#1-#4 的四行,我希望它们都报告所使用的属性已过时,但#3 不是,而且似乎如果我只需直接转到集合属性或方法,属性本身的使用不会被标记为过时。请注意,#3 和#4 引用相同的属性,#4 被标记为使用过时的属性,而#3 则不是。测试表明,如果在表达式中访问属性返回的集合的属性或方法,编译器不会报错。
这是一个错误,还是我不知道的 C# 编译器的“隐藏 gem ”?
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
}
}
}
最佳答案
这是一个真正的错误。不幸的是,由于重构清理错过了这个案例。我为即将在 VS 2010/NDP 4.0 中发布的 C# 4.0 编译器版本修复了此问题,但现在没有计划在 Orcas 中修复它,不幸的是,据我所知没有解决此问题的方法。
我不想这么说,但您需要升级到 NDP 4 csc.exe 或 VS2010 才能解决此问题。
我正在考虑在我全新的 msdn 博客上发布一个关于此的条目。提供了一个很好的轶事示例,说明重构如何破坏您的代码。
伊恩·哈利迪
C# 编译器 SDE
微软
关于c# - 为什么 C# 集合属性在调用它们的属性时没有标记为过时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/577132/