Falsch Typ Erkennung ?

09/09/2009 - 20:02 von Milan | Report spam
Hallo zusammen,

Kann jemand mir helfen um zu verstehen warum innerhalb Funktion
"generic_func"
Objekt of type "TS" ist nicht erkannt als Objekt of type "string"
sonst wie Objekt von type "object" ?
spàter wegen Falsch Typ Erkennung bekomme ich Exception:

Das Objekt des Typs \"System.Collections.Generic.List`1[System.String]\"
kann nicht in Typ \"System.Collections.Generic.List`1[System.Object]\"
umgewandelt werden.

Was sollte ich tun um dass List<some_generic_type> richtig erkannt seinen
Typ ?


Grüß,
Milan.


class Matematician
{
public List<string> getSomeStringType()
{
List<string> lst_string = new List<string>();
return lst_string;
}
}

public void generic_func<TS, TM>(TS obj_string, TM obj_math)
{
Type tt = obj_string.GetType();
//richtig erkannt string type !{Name = "String" FullName =
"System.String"}

try
{
//Exception!
List<TS> obj_generic =
(List<TS>)obj_math.GetType().InvokeMember("getSomeStringType",
BindingFlags.Default | BindingFlags.InvokeMethod, null, obj_math, null);
}
catch (Exception ex)
{
"Das Objekt des Typs \"System.Collections.Generic.List`1[System.String]\"
kann nicht in Typ \"System.Collections.Generic.List`1[System.Object]\"
umgewandelt werden.
Console.WriteLine("error");
}
}

static void Main(string[] args)
{
Class1 obj_main = new Class1(); //Class1 holds main method !
string str_test_1 = "KingOfTheKongo";

object obj_math = new Matematician();
object obj_str = str_test_1;

// Im meinem Project (mehr kompliziert)
// Eingang Variablen: obj_str, obj_math
// sind mit dem Reflection Funktion
// Activator.CreateInstance erzeugt
// so sie haben alle wie hier "object" Typ
obj_main.generic_func(obj_str, obj_math);
}
 

Lesen sie die antworten

#1 Frank Dzaebel
10/09/2009 - 07:50 | Warnen spam
Hallo Milan,

Kann jemand mir helfen um zu verstehen warum innerhalb Funktion
"generic_func" Objekt of type "TS" ist nicht erkannt als Objekt
of type "string" sonst wie Objekt von type "object" ?



Ja, by design. Wenn Du anstatt:

//object obj_math = new Matematician();
//object obj_str = str_test_1;

Matematician obj_math = new Matematician();
string obj_str = str_test_1;

schreibst, sollte es funktionieren.
_______

Die typunsichere Kovarianz wird von C#
nicht unterstützt (Typsicherheit steht hoch im Wert als
Designziel der Sprache), aber in C# 4.0 gibt es
Teil-Szenarien, in denen das typsicher umgesetzt
werden kann (über Interface und delegate mit "out"-
Dekoration des generischen Parameters).

[Kovarianz und Kontravarianz – Wikipedia]
http://de.wikipedia.org/wiki/Kovari...travarianz

[Bruno Terkaly - Microsoft Developer Evangelist : Visual Studio 2010:
Covariance and Contravariance - In search of better examples…]
http://blogs.msdn.com/brunoterkaly/...mples.aspx

[How does C# 4.0 Generic Covariance & Contra-variance Implmeneted? - Stack
Overflow]
http://stackoverflow.com/questions/...mplmeneted


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen