41

파라미터를 입력하는 분산 주석을 추가하는 C#에서 가능하고, 값 유형으로 제한 :C# 분산 주석, 값 유형으로 제한

interface IFoo<in T> where T : struct 
{ 
    void Boo(T x); 
} 

이 변동하는 경우 컴파일러에 의해 허용되는 이유 주석은 그러한 상황에서 완전히 의미가 없습니까?

+1

컴파일러가 인터페이스없이 허용합니까? 기억 인터페이스는 참조 유형입니다. 그리고 구조체에 대한 참조 (인터페이스로)가있을 때 자동으로 박스형으로 나타납니다. – MattDavey

+1

@MattDavey, 인터페이스 제약없이 잘 컴파일됩니다. 공변량/반 변이 형 변환에는 원본 및 대상 유형을 동일하게 표현해야하며 'IFoo '및 'IFoo '은 실제로 다르게 표현되므로 변환이 없습니다. – ControlFlow

+1

좋아, 어리석은 질문에 대해 유감스럽게 생각하지만 누군가 왜 분산 주석 위의 코드에서 이해가되지 않는지 설명 할 수 있습니까? – Tudor

답변

36

왜 이런 상황에서는 분산 주석이 전혀 의미가 없으므로 컴파일러에서 허용하는 이유는 무엇입니까?

나는 C# 4.0 컴파일러에 분산 규칙을 ​​추가 할 때 다른 사람이 그렇게하려고 시도하지 않았기 때문에 컴파일러에서 허용됩니다.

컴파일러 경고 및 오류는 기능, 그리고 구현 될 수있는 기능에 대한 위해, 당신이 당신의 컴파일러를 발송하기 전에, 최소한에, 어떤 점에서의 생각되어야한다. 나는 그렇게하지 못했고 따라서 그런 상황에 대한 경고가 있어야하는지에 대해서도 논쟁의 여지가 없었다.

이제 내 관심을 가져 왔으니 질문은 이되어야합니까? 컴파일러가이 경우에 대해 경고 (또는 오류)를 생성해야합니까?

그것은 판단의 대상입니다. 우리가 생각 하는데요 가지의 수는 다음과 같습니다

  • 코드는 누군가가 재치있는 무언가를 생각에 입력 할 수 있습니다 물건의 종류인가? 하나는 희망하지 않는다. 인터페이스 변형을 만들기 위해 타입 시스템에 대해 충분히 알고있는 개발자는 분산이 참조 유형에서만 작동한다는 것을 알고 있기를 희망합니다. 그러나 어쩌면 거기에 개발자가있을 것이라고 생각하는 사람이 입력 할 수도 있습니다. 그것은 적어도 그럴듯 함을 초월한 것처럼 보이지 않습니다. 그것은 명확하게 고안되지 않았습니다.

  • 코드 이 분명히 잘못 되었습니까?입니까? 예, 아마도 그럴 것입니다. 누군가가 고의적으로 변형 된 인터페이스를 작성하려고하지만 실제로는 그렇지 않다고 생각하는 것은 거의 불가능합니다.

등등.

필자는 더 많은 생각을해야 할 것이다.하지만 언뜻보기에는 실제로 컴파일러에 추가하는 것이 적절할 수도있다. 나는 팀과 이야기 할 것이고 우리는 그것을 Roslyn 버전에 추가하는 것을 고려할 것이다.

아이디어를 제공해 주셔서 감사합니다.

+2

답변 주셔서 감사합니다, Eric! – ControlFlow

+0

하! 그 질문을 읽을 때 처음 생각한 것은 "아무도 그것에 대해 생각하지 않았으며, 기다려서 에릭이 말해야 할 것을 보자."였습니다. 이제는 덧붙일 시간을 갖기를 바란다. 나는 흔히 제네릭 타입 매개 변수에 공분산을 사용하고 경고를받는 것을 자주 보았다. 나는 여전히 30 초 또는 60 초가 걸리는 단계에 있으며, 나는 그것을 위해'class' 제약 조건을 추가해야한다는 것을 기억합니다. 따라서 컴파일러 오류에 대한보다 구체적인 메시지 ("클래스 제약 조건을 추가하는 것을 잊었습니까?"등)을 사용하면 확실하게 도움이 될 것입니다. – phoog

+0

에릭, 당신은 항상 정직합니다! 게다가 지식이 많습니다. :) – nawfal

2

합법적 인 코드이기 때문에 허용됩니다. 그것에 아무런 해가 없습니다. 맞습니다. 반올림 변환을 사용할 수는 없지만 문제를 보지 못했습니다. 코드의 어떤 부분도 실제로 오도 된 것이거나 뒤틀린 것을 숨길 수는 없습니다 gotcha.

는 단순히 T값 형식 또는 참조 유형 분산 타당성을 검사하는 경우 컴파일러는 확인하지 않습니다 생각합니다. C# 팀은 값 유형을 사용하는 사람이 무의미하고 어떤 경우에도 2 차 효과가 없다는 것을 알고 있다고 일반적인 인터페이스 차이를 사용하는 사람이 알 것이라고 추론합니다.