C#에서 다음 방법으로 일반 캐스트 연산자를 과부하 할 수 있습니까?
-
06-07-2019 - |
문제
C# 3.5에서 다음 코드를 나타내는 것이 어쨌든 궁금합니다.
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> ( Foo<T> a )
where U : T {
return new Foo<U>((U)a.Item)
}
}
감사
해결책
변환 연산자는 일반적 일 수 없습니다. 사양 섹션 10.10에서 다음은 변환 운영자 디렉터의 형식입니다.
변환 운영자 디렉터: implicit operator 유형 ( 유형 식별자 ) explicit operator 유형 ( 유형 식별자 )
이것을 메소드 헤더와 비교하십시오.
메소드 헤더: 속성고르다 방법 수수제고르다 부분적고르다 반환 유형 회원 이름 유형 파라미터 목록고르다 ( 공식적인 파라미터 목록고르다 ) 유형 파라미터-제약 조항고르다
(형식에 대해 죄송합니다 - 어떻게 더 잘하는지 잘 모르겠습니다.)
연산자 형식에는 유형 매개 변수 목록 또는 유형 매개 변수 제한 조건이 포함되어 있지 않습니다.
다른 팁
코드가 줄로 늘어납니다. return new Foo<U>((U)a.Item)
베이스 클래스를 상속 클래스에 할당하려고하는 곳은 불가능합니다.
T (Base-Class)가 유형이라고 가정 해 봅시다. Stream
그리고 당신은 유형입니다 MemoryStream
(상속 클래스), 당신은 할당 할 수 없습니다 Stream
변수 유형으로 MemoryStream
.
짧은 대답은 "불가능하다. 대신 메소드를 사용해보십시오"라고 생각합니다.
또한이 질문의 속임수 인 것 같습니다.NET 제네릭의 과부하 작업자 구속 조건에 대한 솔루션
제휴하지 않습니다 StackOverflow