C#에서는 정적 멤버에 인스턴스 멤버로 액세스 할 수 없도록되어 기쁩니다. 그것은 당신이 파생 된 형식 '을 통해'정적 멤버에 액세스 할 수 않습니다, 다른 한편으로상속 된 유형을 통해 정적 멤버에 액세스하는 것이 유용한 이유는 무엇입니까?
Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
: 이것은 자바의 일반적인 버그를 방지 할 수 있습니다. 운영자 (캐스트 작성에서 당신을 구하는 곳) 이외에, 이것이 실제로 도움이되는 어떤 경우도 생각할 수 없습니다. 사실, 적극적으로 같은 실수를 장려 :
// Nasty surprises ahead - won't throw; does something unintended:
// Creates a HttpWebRequest instead.
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com");
// Something seriously wrong here.
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2);
나는 개인적으로 내가 익숙하지 않은 API를 (I 표현 나무로 떨어져 시작하는 기억을 통해 자신의 길을 찾고 있어요 때 반복 유사한 오류를 범 유지
, 나는 편집기에서 BinaryExpression.
충돌 왜 지구상에서 IntelliSense가 옵션으로 MakeUnary
을 제공하고 있는지 궁금해하고있었습니다.) 내 (근시)의 의견으로
,이 기능 :
- 상세 감소하지 않는다; 프로그래머는 어떤 식 으로든 type-name을 지정해야합니다 (현재 형식의 상속 정적 멤버에 액세스 할 때 연산자와 사례 제외).
- 위와 같은 버그/오도 된 코드를 권장합니다.
- 프로그래머에게 C#의 정적 메서드가 일종의 '다형성'을 제시한다고 제안 할 수도 있습니다.
- (보조) 재 컴파일시 의도하지 않은 리 바인딩 가능성을 '자동'으로 도입합니다.
(IMO, 사업자가 자신의 토론을 보증 특별한 경우이다.)
C#을 일반적으로 언어는 "성공의 구덩이"는 것을 감안할 때, 왜이 기능이 존재 하는가? 나는 (IDE에서 항상 해결할 수있는 '발견 가능성'을 제외하고) 그 이점을 볼 수는 없지만 많은 문제점을 보았다.
또는 더 나쁜 경우 'UTF8Encoding.ASCII'. – SLaks
약간 혼동을 줄 수 있다는 것에 동의하지만 * 상속 된 멤버가 파생 된 유형 *의 멤버로 취급된다는 원칙과 일치합니다.우리가 명시 적으로 * 제한된 유형의 매개 변수에 대해이 패턴을 허용하지는 않는다는 점에 유의하십시오. 그 이유는 실제로 잠재적으로 오도 된 것일 수 있기 때문입니다. 자세한 내용은 http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx 을 참조하십시오. –