C# Collection-Properties가 속성을 호출 할 때 쓸모없는 것으로 표시되지 않는 이유는 무엇입니까?

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

  •  05-09-2019
  •  | 
  •  

문제

나는이 컬렉션 속성을 다른 것으로 바꿔야한다는 사실 때문에 모든 발생을 찾아서 경고 목록에서 고칠 것들의 수축 목록을 유지하기 위해 수업에서 수집 속성을 쓸모없는 것으로 표시하려고 시도했습니다.


편집하다: 나는 이것을 Microsoft Connect를 통해 제출했습니다. 이슈 #417159.

16.11.2010 편집: 이것이 .NET 3.5 및 4.0을 컴파일 할 때 C# 4.0 컴파일러에서 작동하는지 확인했습니다. "Not Ok?"라는 주석이 포함 된 코드를 포함하여 게시 된 코드에서 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
        }
    }
}
도움이 되었습니까?

해결책

흠 ... 나에게 컴파일러 버그처럼 보인다! 다음은 실패합니다 (ECMA 334v4) :

24.4.3 쓸모없는 속성 속성은 더 이상 사용되지 않는 유형의 유형과 부재를 표시하는 데 사용됩니다. 프로그램이 쓸모없는 속성으로 장식 된 유형 또는 멤버를 사용하는 경우, 컴파일러는 개발자에게 경고하기 위해 경고 또는 오류를 발행하여 불쾌한 코드를 수정할 수 있습니다. 구체적으로, 컴파일러는 오류 매개 변수가 제공되지 않거나 오류 매개 변수가 제공되고 값이 false 인 경우 경고를 발행해야합니다. 오류 매개 변수가 지정되고 값이 true가있는 경우 컴파일러는 컴파일 타임 오류를 발행해야합니다.

특히, True가 표시되면 오류가 발생해야하며 그렇지 않습니다. 좋은 찾기! "Connect"에보 고하거나 로그인을 설정하는 고통을 원하지 않으면 저에게 알려 주시면 행복하게 로그인하겠습니다 (여기에 게시물을 참조하십시오. "무엇이든"훔치려는 시도 없음).

(업데이트)

재현 할 코드 감소 :

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();}
    }
}

MS C# 2.0 컴파일러와 마찬가지로 Mono 2.0이 올바르게 얻습니다. 고장난 MS C# 3.0 (.NET 3.5) 컴파일러 일뿐입니다.

다른 팁

이것은 진정한 버그입니다. 불행히도이 사례를 놓친 리팩토링 정리로 인해. VS 2010/NDP 4.0에서 나오는 C# 4.0 컴파일러 릴리스에 대해이 문제를 해결했지만 지금은 Orcas에서 문제를 해결할 계획이 없으며 불행히도이 문제를 다루는 작업은 없습니다.

나는 그것을 말하기를 싫어하지만이 문제를 해결할 수있게되면 NDP 4 CSC.EXE 또는 VS2010으로 업그레이드해야합니다.

나는 이것에 대한 새로운 새로운 MSDN 블로그에 항목을 게시 할 생각입니다. 리팩토링이 코드를 깨뜨릴 수있는 방법에 대한 좋은 일화적인 예를 만듭니다.

이안 할리데이

C# 컴파일러 SDE
마이크로 소프트

나는 Marc에 동의합니다. 컴파일러 버그처럼 보입니다. 흥미롭게도 GMC (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