2011-08-04 7 views
7

데이터를 IsolatedStorage에 쓰는 데 사용했던 generics 클래스가 있습니다.C#을 사용하여 제네릭 클래스의 암시 적 변환을 생성 하시겠습니까?

나는 일반 매개 변수 T

예를 들어, 내 일반 클래스에서 변환하는 static implicit operator T()을 사용할 수 있습니다

제 질문은 어떻게 거꾸로 할 수 있습니까?

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

암시 적 연산자는 정적이어야하므로 클래스의 인스턴스를 전달할 수 있는지 확실하지 않습니다.

+1

두 번째 암시 적 연산자는 어떻게 정의합니까? 첫 번째 미러 이미지 (반전 된 유형 포함)와 비슷해야합니다. 작동하지 않습니까? –

+0

그게 효과가 있지만, 새 개체를 만드는 대신 클래스 메서드를 사용하고 싶습니다. – Alan

+1

그래, 그래, 그런 식으로 작동하지 않습니다. 형식 변환은 항상 형식의 새 인스턴스를 생성해야합니다. (실제로, 해당 유형은 변경 불가능해야합니다.) –

답변

7

편집 : 당신은을 변경할 수 있습니다

T Value { get; set; } 

: 당신이 당신의 클래스에서 T의 값을 변경 할 수있게하려면

, 나는 같은 속성으로 노출하는 것이 좋습니다 클래스의 완전히 새로운 인스턴스를 반환하는 암시 적 연산자의 동작 대신 값을 반환합니다.


암시 적 연산자를 사용할 수 있고 사용할 수 없습니다.

public static implicit operator int(MyType m) 
public static implicit operator MyType(int m) 

같은 일을하는 것은 암시 적으로 MyType에서 intint에서 각각 MyType로 변환됩니다. 그러나 고정되어 있으므로 int에서 MyType까지 특별히 MyType의 새 인스턴스를 만들어 반환해야합니다.

그래서이 코드 :
MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

tfoo의 값을 대체 할 것, 암시 적 연산자는 t에서 완전히 새로운 MyClass을 반환하고 Foo에 그를 할당합니다.

+0

편집자에게 오늘 그 일을하는 방법입니다. 나는 어디서나 .Value를 사용하지 않는 것이 더 매끈 할 것이라고 생각했습니다. – Alan

+2

어디서나'.Value'를 사용할 것입니다. 코드를보다 명확하고 읽기 쉽게 유지합니다. 암시 적 연산자는 편리하지만 과용하면 쉽게 코드를 읽기 어려울 수 있습니다. 당신은 올바른 방법으로하고 있습니다. –

1

당신은 단순히 또 다른 암시 적 연산자를 지정하여 다른 방법으로 변환 할 수 있어야한다 :

public static implicit operator MyClass<T>(T input) 
{ 
    return new MyClass<T>(input); 
} 
10

이 클래스는 T와 MyClass에, 두 가지 사이의 변환을 보여줍니다.

class MyClass<T> 
{ 
    public MyClass(T val) 
    { 
    Value = val; 
    } 

    public T Value { get; set; } 

    public static implicit operator MyClass<T>(T someValue) 
    { 
    return new MyClass<T>(someValue); 
    } 

    public static implicit operator T(MyClass<T> myClassInstance) 
    { 
    return myClassInstance.Value; 
    } 
} 
+0

http://stackoverflow.com/questions/39618845/implicit-operator-with-generic-not-working-for-interface에서 추가 질문보기 –

관련 문제