Я столкнулся с проблемой аномалии, где в первый раз, используя ключевое слово var, меня немного.
Возьмите этот очень простой метод
public static Int32? GetNullableInt32(Int32 num)
{
return new Nullable<Int32>(num);
}
Теперь мы можем вызвать этот метод с параметром dynamic, и все будет работать так, как ожидалось.
public static void WorksAsAdvertised()
{
dynamic thisIsAnInt32 = 42;
//Explicitly defined type (no problems)
Int32? shouldBeNullableInt32 = GetNullableInt32(thisIsAnInt32);
Console.Write(shouldBeNullableInt32.HasValue);
}
Однако, объявив shouldBeNullableInt32, используя неявное типирование, результаты далеки от того, что я ожидал бы.
public static void BlowsUpAtRuntime()
{
dynamic thisIsAnInt32 = 42;
//Now I'm a dynamic{int}... WTF!!!
var shouldBeNullableInt32 = GetNullableInt32(thisIsAnInt32);
//Throws a RuntimeBinderException
Console.Write(shouldBeNullableInt32.HasValue);
}
Вместо Nullable<Int32> возвращаемое значение обрабатывается как динамический тип. И даже тогда базовый Nullable<T> не сохраняется. Так как System.Int32 не имеет свойства с именем HasValue, то бросается RuntimeBinderException.
Я был бы ОЧЕНЬ любопытным, чтобы услышать от кого-то, кто может фактически объяснить, что происходит (не просто догадаться).
Два вопроса
- Почему
shouldBeNullableInt32получает неявно введенный в качестве динамического, когда возвращаемый типGetNullableInt32явно возвращаетNullable<Int32>? - Почему базовый
Nullable<Int32>не сохраняется? Почему вместоdynamic{int}? (Ответ здесь: С# 4: Динамический и Nullable < gt;)
UPDATE
Оба ответ Рика Сладке и ответ Эрика Липперта в равной степени действительны. Прочитайте их оба:)