为什么C#集合的属性要求它们的属性时不会被标记为过时了吗?
-
05-09-2019 - |
题
我试图国旗为过时找到所有的occurances和保持的东西萎缩名单在我的警告名单来解决,由于这样的事实,我们需要用别的东西来代替这个集合属性的类集合属性
修改:我已经通过Microsoft连接提交这个,的问题#417159 。
修改16.11.2010 强>:已验证编译为.NET 3.5和4.0时此现在工作在C#4.0的编译器,这两者。我得到4个警告在发布代码,包括一个与评论“不OK?”。
然而,出乎我的意料,列表仅包含几个occurances,远远低于我知道有,并且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
}
}
}
解决方案
嗯...看起来像一个编译器错误给我!它失败以下(ECMA 334v4):
24.4.3过时属性过时属性用于标记 类型的类型和成员应 不再使用。如果程序使用 装饰有类型或成员 过时的属性,则 编译器将发出警告或 为了错误提醒开发商, 所以有问题的代码可以是固定的。 具体而言,编译器会发出 一个警告,如果没有错误参数 提供,或者如果误差参数是 ,并具有值false。该 编译器会发出一个编译时 错误,如果错误参数 指定,并且具有值真。
在特别地,标记为真时,它应该发出一个错误,并且它没有。好找!你可以在“连接”举报,或者如果你不希望建立一个登录的疼痛,让我知道,我会高兴地记录它(这里引用您的文章,没有企图“偷”东西)<。 / p>
(更新)
降低代码重现:
using System;
using System.Collections.Generic;
static class Program {
static void Main() {
int count = Test.Count;
}
[Obsolete("Should error", true)]
public static List<string> Test {
get {throw new NotImplementedException();}
}
}
请注意,单声道2.0得到它的权利,一样的MS C#2.0的编译器。这仅仅是MS C#3.0(.NET 3.5)编译器坏了。
其他提示
这是一个真正的错误。不幸的是由于重构清理错过了这个情况。我解决了这个问题的C#4.0编译释放VS上来2010 / NDP 4.0,但现在还没有计划来解决它在逆戟鲸和遗憾的是没有解决办法,我知道的来处理这个。
我讨厌这样说,但你需要升级到NDP 4 CSC.EXE或VS2010时,他们变得可用来解决这个问题。
我在考虑发布关于这个我的全新的MSDN博客条目。使得重构如何能打破你的代码的好传闻的例子。
伊恩哈利迪
C#编译器SDE,点击 微软
我同意马克:它看起来像一个编译器错误。有趣的是,系膜细胞(Mono的C#编译器)得到它的权利:
Test.cs(65,26): warning CS0219: The variable `list' is assigned but its value is never used
Test.cs(62,38): warning CS0612: `TestApp.BaseClass.Value' is obsolete
Test.cs(63,38): warning CS0612: `TestApp.BaseClass.ValueArray' is obsolete
Test.cs(64,38): warning CS0612: `TestApp.BaseClass.ValueList' is obsolete
Test.cs(65,36): warning CS0612: `TestApp.BaseClass.ValueList' is obsolete
Compilation succeeded - 5 warning(s)