params
수정 자 (배열 유형의 매개 변수 중 하나를 소위 "매개 변수 배열"로 변환 함)가 메소드 서명의 일부가 아니라는 것을 알고 있습니다. 이제 다음 예제를 고려하십시오.메서드 오버라이드에서 params 수정 자 변경
class Giraffid
{
public virtual void Eat(int[] leaves)
{
Console.WriteLine("G");
}
}
class Okapi : Giraffid
{
public override void Eat(params int[] leaves)
{
Console.WriteLine("O");
}
}
경고없이 컴파일됩니다. 그런 말 :
var okapi = new Okapi();
okapi.Eat(2, 4, 6); // will not compile!
오류 (No overload for method 'Eat' takes 3 arguments
)를 제공합니다.
컴파일러가 params
수정자를 해당 매개 변수에 System.ParamArrayAttribute
의 응용 프로그램으로 변환한다는 것을 알고 있습니다. 일반적으로 가상 메소드의 매개 변수에 하나의 속성 콜렉션을 적용한 다음 파생 클래스의 대체 메소드에서 "해당"매개 변수를 다른 속성 세트로 데코 레이팅 할 때 아무런 문제가 없습니다.
그러나 컴파일러는 내 params
키워드를 자동으로 무시하도록 선택합니다. 반대로, 반대로하면 기본 클래스 Giraffid
의 매개 변수에 params
을 적용한 다음 Okapi
의 재정의 키워드를 생략하면 컴파일러에서 메서드를 모두 System.ParamArrayAttribute
으로 꾸미기로 선택합니다. 나는 IL DASM으로 이러한 것들을 확인했다.
내 질문 :
이 문서화 된 행동인가? 나는 C# 언어 명세를 철저히 수색하지 않고 이것에 대해 언급했다.
적어도 Visual Studio 개발 환경은 이것에 대해 혼란 스러울 수 있습니다. 위 메서드 호출에서 2, 4, 6
을 입력 할 때 인텔리 센스는 팁에 void Okapi.Eat(params int[] leaves)
을 표시합니다. 을 비교 한 내용
는, I는 인터페이스 방법을 구현 및 인터페이스 params
의 존재/부재를 변경하고 클래스를 구현했는데, I는 어느 델리게이트 타입 정의의 델리게이트 타입을 정의하고 params
변경 여부를 시도하거나 메서드 그룹에 내 대리자 형식의 변수를 할당 한 메서드 이 경우에는 params
-ness를 완벽하게 변경하는 것이 가능했습니다.
이것도 인터페이스가 작동하는 이유에 대한 답변입니다 (http://stackoverflow.com/questions/27843804/compiling-generic-interface-vs-generic-abstract-class-params-keyword의 중복 코드 샘플) - "override"가 없으므로,'params' *를 사용하는 메소드는 가능한 일치 목록에서 제외되지 않습니다. –