우리 프로그램이 프로덕션 서버에서 중단되었지만 개발 컴퓨터에서는 결코 중단되지 않는 문제를 디버깅하기 시작했습니다. 내 컴퓨터,이 코드 인쇄 "2"에서 실행하면같은 코드가 다른 컴퓨터에서 다르게 작동합니다. 원인은 무엇일까요? (CLR 버전 문제?)
using System;
using System.Collections.Generic;
using System.Linq;
namespace RunTimeBug
{
class Program
{
static void Main(string[] args)
{
var coll = new Collection {{"Test", new Data()}, {"Test2", new Data()}};
var dataSequence = coll.Cast<Data>().ToList();
Console.WriteLine(dataSequence.Count);
}
}
class Collection : Dictionary<string,Data>, IEnumerable<Data>
{
public new IEnumerator<Data> GetEnumerator()
{
foreach(var v in Values)
yield return v;
}
}
class Data { }
}
:
내가 가진 문제를 재현 할 수이 작은 프로그램을 만들었습니다.
Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.KeyValuePair
`2[System.String,RunTimeBug.Data]' to type 'RunTimeBug.Data'.
at System.Linq.Enumerable.<CastIterator>d__b0`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at RunTimeBug.Program.Main(String[] args)
나는이 기계에서 찾을 수있는 유일한 차이, 그것이 작동하는 경우, CLR 런타임 버전 2.0.50727.4927 기계에 있는지, 그리고 버전 : 프로덕션 서버에서 실행하면 다음과 같은 예외와 함께 실패 2.0.50727.1433이 작동하지 않는 시스템의 경우
캐스트 확장 메서드는 구형 컴퓨터에서 IEnumerable의 잘못된 버전을 가져 오지만 최신 컴퓨터에서는 "올바른"버전입니다.
누구나 내가 이것을보고있는 이유를 설명 할 수 있습니까? 2 CLR 런타임 버전간에 변경된 사항이 원인 일 수 있습니까?
이미 수정 프로그램을 배포했으며 위에 나온 코드의 Collection 클래스는 2 개의 다른 IEnumerable을 구현하므로 디자인이 좋지 않습니다. 이것은 우리 제품의 "야생에서"발견되었으므로 정확한 원인을 알고 싶습니다.
간단히 말해, 인터페이스를 다시 구현하는 경우 모든 "묶인"멤버를 다시 구현해야합니다. IEnumerable의 경우 이것은 IEnumerable .GetEnumerator()와 IEnumerable.GetEnumerator()를 모두 구현하는 것을 의미합니다. –