Mam problem ze zrozumieniem tego, co jest przyczyną błędu kompilacji w poniższym kodzie:Dziwne zachowanie przełącznik w .NET 4
static class Program
{
static void Main()
{
dynamic x = "";
var test = foo(x);
if (test == "test")
{
Console.WriteLine(test);
}
switch (test)
{
case "test":
Console.WriteLine(test);
break;
}
}
private static string foo(object item)
{
return "bar";
}
}
Błąd pojawia jest w switch (test)
line:
A switch expression or case label must be a bool, char, string, integral,
enum, or corresponding nullable type.
pokazy Intellisence mnie, że operacja foo zostanie rozwiązana w czasie wykonywania, co jest w porządku, ponieważ używam typu dynamicznego jako parametru. Jednak nie rozumiem, w jaki sposób warunek kompiluje się dobrze, gdy przełącznik nie.
Powyższy kod jest po prostu uproszczoną wersją tego, co mam w mojej aplikacji (VSTO), która pojawiła się po migracji aplikacji z VSTO3 do VSTO4, gdy jedna metoda w VSTO została zmieniona, aby zwracać wartości typu dynamic
zamiast object
.
Czy ktoś może mi wyjaśnić, na czym polega problem. Wiem, jak to rozwiązać, ale chciałbym zrozumieć, co się dzieje.
Wygląda na to, że nie możesz ducktype przełącznika –
Ponieważ 'switch' nie jest zdefiniowany dla każdego możliwego typu obiektu – thecoop
Wszyscy wydają się odpowiadać tak, jakby pytanie brzmiało" Dlaczego nie mogę "przełączać' na 'dynamiczny '?" Myślę, że pytanie powinno brzmieć "Dlaczego" test "jest na początku" dynamiczny "? Rozumiem, że * jeśli * 'foo' ma przeciążenia, które zwróciły różne typy,' test' musiałby być "dynamiczny"; ale ponieważ to * nie *, nadal mam problem z ustaleniem odpowiedzi na "prawdziwe" pytanie tutaj. –