Аномалия при использовании «var» и «динамический»C#

Место общения программистов C#
Ответить
Anonymous
 Аномалия при использовании «var» и «динамический»

Сообщение Anonymous »

Я столкнулся с аномалией, когда меня впервые укусило использование ключевого слова var.

Воспользуйтесь этим очень простым методом

Код: Выделить всё

public static Int32? GetNullableInt32(Int32 num)
{
return new Nullable(num);
}
Теперь мы можем вызвать этот метод с динамическим параметром, и все будет работать как положено.

Код: Выделить всё

public static void WorksAsAdvertised()
{
dynamic thisIsAnInt32 = 42;

//Explicitly defined type (no problems)
Int32? shouldBeNullableInt32 = GetNullableInt32(thisIsAnInt32);

Console.Write(shouldBeNullableInt32.HasValue);
}
Однако при объявлении mustBeNullableInt32 с использованием неявной типизации результаты далеки от тех, которые я ожидал.

Код: Выделить всё

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, возвращаемое значение обрабатывается как динамический тип. И даже в этом случае базовый Nullable не сохраняется. Поскольку System.Int32 не имеет свойства с именем HasValue, генерируется исключение RuntimeBinderException.

Мне было бы ОЧЕНЬ любопытно услышать мнение кого-нибудь, кто действительно может объяснить, что происходит (а не просто догадываться).

Два вопроса
  • Почему долженBeNullableInt32 получить неявно типизированный как динамический, когда возвращаемый тип GetNullableInt32 явно возвращает Nullable?
  • Почему базовый Nullable не сохраняется? Почему вместо этого используется динамический{int}? (Ответ здесь: C# 4: Dynamic and Nullable)


ОБНОВЛЕНИЕ

И ответ Рика Сладки, и ответ Эрика Липперта одинаково действительны. Пожалуйста, прочитайте их оба :)

Подробнее здесь: https://stackoverflow.com/questions/743 ... nd-dynamic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»