이 질문은 시간이 오래 걸리므로 제발 같이 따라주십시오.Func <> s의 List <>는 일반 반환 형식의 오류를 컴파일하지만 그 이유는 무엇입니까?
은 내가 문자열의 세트와 각각의 문자열에 대한 해당 제네릭 메서드 호출 사이의 매핑을 만들어야합니다. 그러나 나는 컴파일 문제에 직면 해있다.
제 생각에는 Dictionary<>
을 사용하고 있지만 문제는 List<>
에 대해서도 동일하게 존재합니다. 단순화를 위해 아래 예에서 List<>
을 사용하고 있습니다.
public abstract class MyBase { /* body omitted */ }
public class MyDerived1 : MyBase { /* body omitted */ }
public class MyDerived2 : MyBase { /* body omitted */ }
그리고 다른 클래스의 방법 :
이 세 클래스 고려
public class SomeClass
{
public void SomeFunc()
{
var test = new Test();
var list1 = new List<Func<MyBase>>
{
test.GetT<MyDerived1>,
test.GetT<MyDerived2>
};
}
}
: 다른 클래스에서
public class Test
{
public T GetT<T>() where T : MyBase { /* body omitted */ }
}
를,이 같은 List<Func<MyBase>>
을 선언 할 수 있습니다 이것은 모두 괜찮아요.
하지만, 내가이 같은 제네릭 클래스를 반환하는 함수 갖고 싶어 :
public class RetVal<T> where T : MyBase { /* body omitted */ }
public class Test
{
public RetVal<T> GetRetValT<T>() where T : MyBase
{
return null;
}
}
을 그리고이 기능을 사용하여 해당 List<>
을 만들려고합니다. 즉 목록 >>?
public class Class1
{
public void SomeFunc()
{
var test = new Test();
var list2 = new List<Func<RetVal<MyBase>>>
{
test.GetRetValT<MyDerived1>, // compile error
test.GetRetValT<MyDerived2> // compile error
};
}
}
컴파일 오류가 Expected a method with 'RetVal<MyBase> GetRetValT()' signature
이됩니다.
그래서이 문제를 해결할 수있는 방법이 있습니까? 아니면 내 문자열을 만드는 데 사용할 수있는 대체 방법이 있습니까? 매핑을 호출 하시겠습니까?
그것은 분산 문제입니다. 기본적으로,'RetVal'*는'RetVal '이 아닙니다. 시간이있을 때 자세한 내용. –
@ 존스 쉘 (JonSkeet)이 말한 것은 사실입니다. 그것은 C#의 법칙입니다. 'RetVal'의 MyDerived를'RetVal '의 MyBase에 넣고 싶다면'RetVal'을 타입이없는 generic도 받아 들여야합니다. 즉,'RetVal '입니다. 여기 예제를 참조하십시오 : http://www.ienablemuch.com/2012/05/generics-object-orientation-untyped.html –
나는 이것에 대해 전적으로 근본적이지는 않지만 제네릭을 돌려 주려는 아이디어는 아닙니다. generic이 (결국) 컴파일러가 컴파일 타임에 알고있는 것에 해결해야한다는 개념을 위반합니까? 즉, 컴파일러가 매우 오류를 throw하는 이유는 특정 유형을 반환 할 수있는 메소드를 제공하기를 기대하기 때문입니다. 내가 말했던 바로 그 관찰은 여기 근거지가되는 길일 수도 있습니다 ... –