2012-11-01 4 views
24

나는 그것을 얻지 않는다. As 운영자 :구조체의 as 연산자는 무엇입니까?

The as operator is used to perform certain types of conversions between compatible reference or nullable types.

그럼 왜 다음을 수행 사용할 수 있습니까?

struct Baby : ILive 
{ 
    public int Foo { get; set; } 

    public int Ggg() 
    { 
     return Foo; 
    } 
} 

interface ILive 
{ 
    int Ggg(); 
} 

void Main() 
{ 
    ILive i = new Baby(){Foo = 1} as ILive; // ?????? 
    Console.Write(i.Ggg());     // Output: 1 
} 
  • Baby

    stack의 값을 넣어 만들어 구조체이다. 여기에는 참조가 있습니다.

  • 여기에는 null 허용 유형이 없습니다.

왜 내가 틀렸는가?

+0

Btw, Baby와 같은 변경 가능한 개체는 가난한 구조체를 만듭니다. 클래스가 더 분명한 선택이 될 것입니다. –

+0

@ MarGravell of-course. 하지만이 질문은 가장자리 시나리오를 더 잘 이해하기위한 것입니다. :-) –

답변

34

인터페이스로 캐스팅하면 관리되는 힙에 박스형 복사본이 만들어지고 박스형 복사본에 대한 참조가 반환됩니다. 상자는 인터페이스를 구현합니다.

+0

사실 인터페이스가 System.object를 상속하지 않는다는 것과 아무 관계가 없다는 것을 알지 못합니까? –

+4

@RoyiNamir 최소한입니다. 인터페이스는 항상 참조 유형이며, 제네릭은 제한적일 수 있습니다. * 유형 (참조 유형과 값 유형 사이의 중간) –

9

오른쪽이 인터페이스이기 때문에 작동합니다. 조건은 오른쪽이 null을 값으로 허용 할 수 있다는 것입니다. 즉, 참조 유형 또는 Null 값 유형입니다. 인터페이스는 참조 유형입니다. 이 경우 코드는 구조체를 상자에 넣은 다음 박스형 객체를 인터페이스로 캐스팅합니다.

+0

인터페이스의 정적 유형을 가진 모든 것은 참조입니다. 값 유형을 인터페이스로 변환하면 상자가 만들어집니다 (참조가 제공됩니다). 따라서이 문맥에서 참조 유형이라고 부르는 것이 타당합니다. – CodesInChaos

+0

항상 "anything"에 대한 부분적인 예외가 있습니다 : 일부 'T'에 대한 일반 제한 조건을 통해 설명되는 인터페이스. "제약"부분은 변수 자체가 인터페이스 일 때 변수가 'T'일 때만 적용됩니다. –

0

참조 유형 ILive nullable 값으로 캐스트하면 오류가 발생하지 않습니다. 그러나이 주석 코드를 사용하면 오류가 발생합니다. 당신이 값 형식에 as와 함께 캐스팅하려고하고는 null이 될 수 없기 때문에

Baby b = new Baby(); 
object o = b; 
//Baby bb = o as Baby ; 

입니다.