수색…


비고

주조변환 과 동일하지 않습니다. 문자열 값 "-1" 을 정수 값 ( -1 )으로 변환 할 수도 있지만 Convert.ToInt32() 또는 Int32.Parse() 와 같은 라이브러리 메서드를 통해 수행해야합니다. 변환 구문을 직접 사용하여 수행 할 수 없습니다.

기본 유형으로 객체 캐스트

주어진 다음의 정의 :

public interface IMyInterface1
{
    string GetName();
}

public interface IMyInterface2
{
    string GetName();
}

public class MyClass : IMyInterface1, IMyInterface2
{
    string IMyInterface1.GetName()
    {
        return "IMyInterface1";
    }

    string IMyInterface2.GetName()
    {
        return "IMyInterface2";
    }
}

객체를 기본 유형으로 변환하는 예제 :

    MyClass obj = new MyClass();

    IMyInterface1 myClass1 = (IMyInterface1)obj;
    IMyInterface2 myClass2 = (IMyInterface2)obj;

    Console.WriteLine("I am : {0}", myClass1.GetName());
    Console.WriteLine("I am : {0}", myClass2.GetName());

    // Outputs :
    // I am : IMyInterface1
    // I am : IMyInterface2

노골적인 주조

특정 유형의 값임을 알고있는 경우 해당 유형이 필요한 컨텍스트에서 값을 사용하기 위해 해당 값을 해당 유형으로 명시 적으로 형변환 할 수 있습니다.

object value = -1;
int number = (int) value;
Console.WriteLine(Math.Abs(number));

우리가 통과 시도하는 경우 value 직접 Math.Abs() 하기 때문에, 우리는 컴파일시 예외를 얻을 것 Math.Abs() 걸리는 과부하가없는 object 매개 변수로합니다.

value intvalue 할 수없는 경우이 예제의 두 번째 행은 InvalidCastException 을 발생시킵니다.

안전한 명시 적 캐스팅 (`as '연산자)

생각하는 유형의 값인지 확실하지 않은 경우 as 연산자를 사용하여 값을 안전하게 캐스팅 할 수 있습니다. 그 값이 그 형태가 아닌 경우, 결과의 값은 null 됩니다.

object value = "-1";
int? number = value as int?;
if(number != null)
{
    Console.WriteLine(Math.Abs(number.Value));
}

null 값에는 유형이 없으므로, as 키워드는 null 값을 3 null 할 때 안전하게 null 합니다.

암시 적 주조

컴파일러가 항상 해당 유형으로 변환 할 수 있음을 알고있는 경우 값은 해당 유형으로 자동 변환됩니다.

int number = -1;
object value = number;
Console.WriteLine(value);

이 예제에서는 컴파일러가 모든 intobject s에 캐스팅 할 수 있다는 것을 알고 있기 때문에 일반적인 명시 적 캐스팅 구문을 사용할 필요가 없었습니다. 사실, 우리는 변수를 생성하지 않고 -1 object 를 기대하는 Console.WriteLine() 의 인수로 직접 전달할 수 있습니다.

Console.WriteLine(-1);

전송하지 않고 호환성 확인하기

값 유형이 주어진 유형을 확장 또는 구현하는지 여부를 알아야하지만 실제로 그 유형으로 형변환하지 않으려면 is 연산자를 사용할 수 있습니다.

if(value is int)
{
   Console.WriteLine(value + "is an int");
}

명시 적 수치 변환

명시 적 형변환 연산자는 서로 확장하거나 구현하지 않더라도 숫자 유형의 변환을 수행하는 데 사용할 수 있습니다.

double value = -1.1;
int number = (int) value;

대상 유형의 원래 유형보다 정밀도가 낮은 경우 정밀도가 손실됩니다. 예를 들어 위의 예에서 double 값으로 -1.1 은 정수 값으로 -1 됩니다.

또한 숫자 변환은 컴파일 타임 유형에 의존하므로 숫자 유형이 객체에 "박스"로 묶여 있으면 작동하지 않습니다.

object value = -1.1;
int number = (int) value; // throws InvalidCastException

변환 연산자

C #에서는 형식에서 사용자 지정 변환 연산자를 정의 할 수 있습니다.이 연산자를 사용하면 명시 적 또는 암시 적 캐스트를 사용하여 값을 다른 형식으로 변환하거나 변환 할 수 있습니다. 예를 들어 JavaScript 표현식을 나타내는 클래스를 생각해보십시오.

public class JsExpression
{
    private readonly string expression;
    public JsExpression(string rawExpression)
    {
        this.expression = rawExpression;
    }
    public override string ToString()
    {
        return this.expression;
    }
    public JsExpression IsEqualTo(JsExpression other)
    {
        return new JsExpression("(" + this + " == " + other + ")");
    }
}

두 개의 JavaScript 값을 비교하는 JsExpression을 만들려면 다음과 같이하면됩니다.

JsExpression intExpression = new JsExpression("-1");
JsExpression doubleExpression = new JsExpression("-1.0");
Console.WriteLine(intExpression.IsEqualTo(doubleExpression)); // (-1 == -1.0)

그러나 명시 적 변환 을 사용할 때 단순 변환을 허용하기 위해 명시 적 변환 연산자JsExpression 추가 할 수 있습니다.

public static explicit operator JsExpression(int value)
{
    return new JsExpression(value.ToString());
}
public static explicit operator JsExpression(double value)
{
    return new JsExpression(value.ToString());
}

// Usage:
JsExpression intExpression = (JsExpression)(-1);
JsExpression doubleExpression = (JsExpression)(-1.0);
Console.WriteLine(intExpression.IsEqualTo(doubleExpression)); // (-1 == -1.0)

또는, 우리는 구문이 훨씬 간단하게 암시 이러한 연산자를 변경할 수 있습니다.

public static implicit operator JsExpression(int value)
{
    return new JsExpression(value.ToString());
}
public static implicit operator JsExpression(double value)
{
    return new JsExpression(value.ToString());
}

// Usage:
JsExpression intExpression = -1;
Console.WriteLine(intExpression.IsEqualTo(-1.0)); // (-1 == -1.0)

LINQ 주조 작업

다음과 같은 유형이 있다고 가정합니다.

interface IThing {  }
class Thing : IThing {  }

LINQ를 사용하면 Enumerable.Cast<>()Enumerable.OfType<>() 확장 메서드를 통해 IEnumerable<> 의 컴파일 타임 제네릭 형식을 변경하는 프로젝션을 만들 수 있습니다.

IEnumerable<IThing> things = new IThing[] {new Thing()};
IEnumerable<Thing> things2 = things.Cast<Thing>();
IEnumerable<Thing> things3 = things.OfType<Thing>();

things2 평가의 Cast<>() 메소드에 모든 값을 캐스팅해야 할 것이다 thingsThing 들. 캐스트 할 수없는 값이 발견되면 (자), InvalidCastException 가 Throw됩니다.

things3 이 평가 될 때 OfType<>() 메소드는 똑같은 작업을 수행합니다. 단, 캐스팅 할 수없는 값이 발견되면 예외를 던지기보다는 단순히 값을 생략합니다.

이러한 메소드의 제네릭 유형으로 인해 변환 연산자를 호출하거나 숫자 변환을 수행 할 수 없습니다.

double[] doubles = new[]{1,2,3}.Cast<double>().ToArray(); // Throws InvalidCastException

해결 방법으로 .Select() 내부에서 캐스트를 수행하기 만하면됩니다.

double[] doubles = new[]{1,2,3}.Select(i => (double)i).ToArray();


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow