Heren,
Ik loop een beetje te rommelen met de implementatie van een generic methode, en het vreemde is dat de meest logische methode niet lijkt te werken, terwijl de meest foute methode wel geaccepteerd wordt door de compiler (.NET 3.5)...
Wie kan mij uitleggen waarom ExecuteRetrieveMultiple1 een compile-time error veroorzaakt, terwijl ExecuteRetrieveMultiple2 wel gewoon lijkt te werken?
Wat zie ik over het hoofd?
Edit:De code is onderdeel van een mock die ik maak om een backend systeem mee te faken. De signature van de generic methode wordt dus bepaald door de interface van de backend, maar de implementatie is een mock. Vandaar de ogenschijnlijk vreemde constructie
Ik loop een beetje te rommelen met de implementatie van een generic methode, en het vreemde is dat de meest logische methode niet lijkt te werken, terwijl de meest foute methode wel geaccepteerd wordt door de compiler (.NET 3.5)...
Wie kan mij uitleggen waarom ExecuteRetrieveMultiple1 een compile-time error veroorzaakt, terwijl ExecuteRetrieveMultiple2 wel gewoon lijkt te werken?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| public abstract class CrmEntity { } public class Contact : CrmEntity { } public class Program { public IList<T> ExecuteRetrieveMultiple1<T>(object query) where T : CrmEntity { T contact = (T)GetContact(); //error CS0030: Cannot convert type 'GenericTypeTest.Contact' to 'T' //Waarom niet, T is in ieder geval een CrmEntity, dus downcasten naar //Contact zou soms moeten kunnen, toch? IList<T> result = new List<T>(); if (contact != null) result.Add(contact); return result; } public IList<T> ExecuteRetrieveMultiple2<T>(object query) where T : CrmEntity { Contact contact = GetContact(); IList<Contact> result = new List<Contact>(); if (contact != null) result.Add(contact); return (IList<T>)result; //Compiler klaagt niet, terwijl dit een downcast is voor elk element, //iets wat in .NET 3.5 niet zomaar zou mogen! } public Contact GetContact() { return new Contact(); } static void Main(string[] args) { } } |
Wat zie ik over het hoofd?
Edit:De code is onderdeel van een mock die ik maak om een backend systeem mee te faken. De signature van de generic methode wordt dus bepaald door de interface van de backend, maar de implementatie is een mock. Vandaar de ogenschijnlijk vreemde constructie
[ Voor 8% gewijzigd door MrBucket op 01-03-2010 13:27 ]