Biorąc pod uwagę następujący kod C#:Typ wnioskowania w C# nie działa?
var a = new[] {"123", "321", 1}; //no best type found for implicitly typed array
i jego odpowiednik w VB.NET:
Dim a = {"123", "321", 1} 'no errors
Wydaje się, że VB.NET jest w stanie prawidłowo wywnioskować typ a
= Object()
, podczas gdy C# narzeka do czasu powyższego jest ustalona na:
var a = new object[] {"123", "321", 1};
Czy istnieje sposób, aby typ automatycznego wnioskowania w języku C# dla powyższego scenariusza?
EDIT: Ciekawa obserwacja po gry z różnych typów w C# piaskownicy - typ jest poprawnie wywnioskować, czy wszystkie elementy mają wspólnego rodzica w drzewie dziedziczenia, a rodzic jest nieObject
, czy elementy mogą być odlewane w szerszy typ (bez utraty precyzji, na przykład Integer -> Double
). Tak więc oba te będą pracować:
var a = new[] {1, 1.0}; //will infer double[]
var a = new[] {new A(), new B()}; //will infer A[], if B inherits from A
myślę, że to zachowanie jest niezgodne z C#, ponieważ wszystkie typy dziedziczą Object
, więc to nie jest o wiele inny przodek niż jakikolwiek inny rodzaj. Jest to prawdopodobnie projekt wstępny, więc nie ma sensu dyskutować, ale jeśli znasz przyczynę, byłoby interesujące wiedzieć, dlaczego.
prostu ciekawi, można byłoby lepiej z użyciem znakowanego przedmiotu zamiast pozbawionym typu tablicy? – CookieOfFortune
@ CookieOfFortune: Czasami muszę napisać szybki i zabrudzony kod, głównie z powodów prototypowania, często by pomóc innym ludziom na SO. Tworzenie obiektu do tego celu nie jest możliwe. – Neolisk
Przepraszam, miałem na myśli anonimowy obiekt: var a = new {Str1 = "123", Str2 = "321", AnInteger = 1}; – CookieOfFortune