정적 암시 적 연산자


158

최근 에이 코드를 찾았습니다.

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }

무슨 static implicit operator뜻입니까?

답변:


263

이것은 변환 연산자 입니다. 이 코드를 작성할 수 있음을 의미합니다.

XmlBase myBase = new XmlBase();
XElement myElement = myBase;

그리고 컴파일러는 불평하지 않을 것입니다! 런타임에 변환 연산자가 실행 myBase되어 인수로 전달 되고 유효한 XElement결과를 반환합니다 .

개발자가 컴파일러에게 알려주는 방법입니다.

"이것들은 완전히 관련이없는 두 가지 유형처럼 보이지만 실제로는 다른 형식으로 변환하는 방법이 있습니다.이를 수행하는 방법에 대한 논리를 다루겠습니다."


11
+1. 암시 적 변환을 사용하는 경우가 가끔 있지만, 이상하고 놀라운 버그가 발생할 수 있으며 (인간적인) API 사용자를 혼동시킬 수 있다고 덧붙입니다. 예를 들어, BCL에는 암시 적 변환 사용법이 거의 없습니다. 신중하게 사용하십시오!
Drew Noakes

13

당신은 변환 할 수 있습니다 암시 운영자 수단 등 XmlBaseXElement암시.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;

이 명시 적 변환이 어쨌든 작동합니까? XElement xelement = (XElement)xmlBase;질문에서 그것은 static정적이어야합니까? 비정적일 수 없어 인스턴스화 할 수 있습니까?
주목받는

6

또 다른 흥미로운 사용법은 (Unity가 객체 (따라서 MonoBehavior의 인스턴스)가 null인지 확인한 것입니다)입니다.

public static implicit operator bool (CustomClass c)
{
    return c != null;
}

코드는 클래스 안에 있어야합니다 (이 경우 CustomClass). 그렇게하면 다음과 같이 할 수 있습니다 :

void Method ()
{
    CustomClass c1 = null;
    CustomClass c2 = new CustomClass ();

    bool b1 = c1; // is false
    bool b2 = c2; // is true

    if (!c1 && c2)
    {
        // Do stuff
    }
}

분명히 가장 악명 높은 용도는 클래스 중 하나를 다른 클래스로 변환하는 데 사용하는 것일 수 있습니다. 그러나 기본 유형과 함께 사용하는 것도 고려할 가치가 있습니다.


1
좋은 트릭! 한 가지주의해야 할 다음 static implicit operator bool방법을 선언해야합니다 내부CustomClass . 데모 목적 으로 DotNetFiddle 을 만들었습니다 .
매트

1
@Matt-아, 내 대답은 지금 2 살입니다. 코드를 약간 업데이트하고 힌트를 추가했습니다.
전투

4

암시 적 변환 연산자입니다 ( (type)변환 구문 이 필요한 명시 적 연산자와 반대 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.