필자가 쓰는 일반 메서드에 문제가 있습니다. 다음 서명이 있습니다.C# 일반 메서드에서 캐스팅 문제가 발생했습니다.
public static ThingCollection<T> GetThings<T>(...) where T : Thing
몇 가지 클래스가 있습니다. ThingA, ThingB 및 ThingC는 Thing을 상속받습니다. 이 메소드에서 이와 비슷한 코드를 사용할 수 있기를 원합니다.
var things = new ThingCollection<T>();
if (typeof(T) == typeof(Thing))
foreach (var item in someCollection)
things.Add((T)new Thing(...));
else if (typeof(T) == typeof(ThingA))
foreach (var item in someCollection)
things.Add((T)new ThingA(...));
else if (typeof(T) == typeof(ThingB))
foreach (var item in someCollection)
things.Add((T)new ThingB(...));
else if (typeof(T) == typeof(ThingC))
foreach (var item in someCollection)
things.Add((T)new ThingC(...));
else
throw new Exception("Cannot return things of type " + typeof(T).ToString());
return things;
문제
내가 새로운 개체를 캐스팅하지 않는 경우 최고의 오버로드 된 메서드 경기가 무효 인수를 오류가 얻을 수 있다는 것입니다. 위에 표시된대로 T 캐스트를 추가하는 것이 새로운 Thing()에 적합하지만 보고서 다른 새로운 호출의 경우 'ThingA'유형을 'T'으로 변환 할 수 없습니다. Intellisense는 T가 Thing이라는 것을 나타냅니다.하지만 다른 객체를 Thing으로 상속 할 수없는 이유를 이해하지 못합니다.아마도 이것은 내가하려는 일을하는 올바른 방법이 아닙니다. 나는 올바른 길을 가고 있는가? 아마 약간의 작은 뉘앙스를 놓치거나 내가 완전히 다른 것을해야합니까?
큰 도움이되었습니다. 일반 목록에서 상속 받기 때문에 ThingCollection을 일반화 할 필요가 없다는 사실을 깨닫지 못했기 때문에 제네릭에 대한 이해를 얻으려고 싸우고있었습니다. –