为什么C#集合的属性要求它们的属性时不会被标记为过时了吗?

StackOverflow https://stackoverflow.com/questions/577132

  •  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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top