Я столкнулся с проблемой аномалии, где в первый раз, используя ключевое слово 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
Оба ответ Рика Сладке и ответ Эрика Липперта в равной степени действительны. Прочитайте их оба:)