2011-06-28 24 views
5
var dict = new Dictionary<string, object>(); 
DateTime? myDate; 

/*Next line gives: Type of conditional expression cannot be 
determined because there is no implicit conversion between 'System.DateTime?' 
and 'System.DBNull' */ 

dict.Add("breakit", myDate.HasValue ? myDate.Value : DBNull.Value); 

Nie rozumiem, dlaczego musi istnieć niejawna konwersja, jeśli jedna lub druga wchodzi do słownika oczekującego typu Object.Dlaczego nie mogę używać operatora potrójnego z tym wyrażeniem?

+2

Jest to bardzo często zadawane pytanie na SO. Szczegółowe informacje można znaleźć na stronie http://stackoverflow.com/questions/2215745/conditional-operator- cannon -cast-implicitly/2215959#2215959. Zobacz także mój powiązany artykuł http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive- law.aspx –

+0

@Eric Będę Sprawdź to. Dzięki! – scottm

+1

Nie ma za co. Problem polega na tym, że rozumujesz w przeciwnym kierunku, niż to wynika z kompilatora. Mówisz: "Wiem, że to będzie coś, co oczekuje obiektu". Ale kompilator nie wie, że ty * a priori * chcesz wybrać metodę "obiektu". Kompilator próbuje rozumować w inny sposób. Pyta "czy metoda oczekuje obiektu zgodnego z tym wyrażeniem?" Aby wiedzieć, że musi zapytać "Jaki jest typ wyrażenia?" ** Problem polega na tym, że nie można ustalić typu wyrażenia, aby zdecydować, czy wyrażenie działa. ** –

Odpowiedz

6

W języku C# każde wyrażenie warunkowe musi mieć typ. Jakiego rodzaju jest twoja ekspresja?

Rozumiem twoją troskę, konwersja nie jest potrzebna w twoim konkretnym przypadku, ale tak działa kompilator C#, więc musisz przestrzegać jego zasad.

To powinno działać zamiast (nie sprawdzałem choć):

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value); 
+0

Moje wyrażenie powinno być albo typu System.DateTime, albo DBNull w zależności od stanu myDate.Value – scottm

+0

Przesyłanie do obiekt działa. – scottm

+0

to nie jest typ statyczny, ale dynamiczny. Kompilator C# jest typu statycznego (poza pewną "dynamiczną" mechaniką, której nie jestem do końca pewien). – Zruty

1

Czy spróbować:

DateTime? date = myDate.HasValue ? myDate.Value : null; 

dict.Add("breakit", date); 
+1

Daje to ten sam błąd. – scottm

+0

Chociaż nie rozumiem, dlaczego musimy rzucić obiekt, gdy jest to podstawowa klasa bazowa! –

Powiązane problemy