2016-09-20 2 views
2

이것이 작동하지 않는 이유가 표시되지 않습니다. double에서 decimal으로 직접 전송할 수 있지만 예기치 않게 내부에있는 경우이 캐스트를 수행 할 수 없습니다. 제네릭 클래스는,이 조각은 더 잘 설명 :일반 십진수는 double에서 캐스팅 할 수 없습니다.

public class TestCollection<T> 
{ 
    public void Add(object value) 
    { 
     //When T is decimal, then I get 
     // System.InvalidCastException 
     var t = (T) value; 
    } 
} 

public void Main() 
{ 
    var t = new TestCollection<decimal>(); 
    double doub = 10; 

    var decim = (decimal) doub; //Works!  
    t.Add(doub);    //throws! 
} 

System.InvalidCastException 사용자 코드 = 지정한 캐스트가 잘못되었습니다 HRESULT = -2147467262 메시지 처리되지 않은이었다. 출처 = WPF 스택 트레이스 : Wpf.TestCollection`1.Add C에서 (개체 값)에서 : \ 사용자 \ btord \ 소스 \ 레 포스 \ 라이브 차트 \ 예 \ WPF JimmyTheTestsGuy.xaml.cs \ : 라인 15 에서 C : \ Users \ btord \ Source \ Repos \ Live-Charts \ Examples \ Wpf \ JimmyTheTestsGuy.xaml.cs에있는 Wpf.JimmyTheTestsGuy..ctor()는 C : \의 Wpf.MainWindow..ctor()에있는 35 줄입니다. 사용자 \ btord 소스 \ 레 포스 \ 라이브 차트 \ 예 \ WPF \ MainWindow.xaml.cs를 \ 라인 (56) 가의 InnerException : 다음과 같은 이유

+0

이것은 두 번이 아니라 객체를 전달하기 때문에 발생합니다. – steryd

+2

왜'value'의 타입은'T'가 아닌'object'입니까? – Lee

+0

@Lee 오버로드가 두 개 있습니다. 하나는 T이고 하나는 객체입니다. 객체 오버로드가 호출되면 오류가 발생합니다. 코드의 작은 부분입니다. –

답변

5

그것은 인해 동일한 이유로 실패는 실패

short s = 1; 
object o = s; 
var i = (int)o; //Runtime error 

박스형 값이 실제 유형에만 언 박싱 될 수있는 이유. 귀하의 경우에는 권투는 double이며 decimal에 unbox하려고합니다. 그건 허용되지 않습니다.

전체 디자인을 뒤로 밀고 싶습니다. 일반 콜렉션이 T입니다. Add 메서드는 T을 수락하고 발신자가 올바른 유형으로 변환해야하는 부담을지게합니다. 이것이 유효한 해결책이 아니라면 generics를 모두 제거하고 단순히 객체 컬렉션을 구현하십시오.

+0

해결 방법을 찾을 수있는 아이디어가 있습니까? –

+0

@ bto.rdz'public void Add (dynamic value)'는'dynamic'으로 괜찮 으면 작동하는 것 같습니다. – Quantic

+0

@ bto.rdz 내 대답의 업데이트를 참조하십시오. – InBetween

4

당신은 그것에 대해 Convert.ChangeType을 사용할 수 있습니다 : 당신이 당신의 Add 메서드의 동적 사용할 수 있습니다 T의 INSEAD 객체가 필요한 경우 https://dotnetfiddle.net/0Tfgyz

+0

감사합니다.이 메서드는 내 코드에서 매우 중요하므로이 메서드로 성능에 대해 걱정하고 있습니다. –

+0

Ok. 어쩌면 당신은 그것이 그것이 없는지를보기 위해 먼저 그것을 프로파일 링해야합니다. 그냥'ChangeType'의 성능을 다루는 stackoverflow 대답을 발견했습니다 : http://stackoverflow.com/questions/1532197/faster-version-of-convert-changetype – Nico

1

:

public void Add(object value) 
{ 
    var t = Convert.ChangeType(value, typeof(T)); 
} 

가 바이올린을 참조하십시오.

public void Add(object value) 
{ 
     //When T is decimal, then I get 
     // System.InvalidCastException 
     dynamic t1 = value; 
     var t = (T)t1; 
} 
관련 문제