Аномалия при использовании 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.
  • Почему метод mustBeNullableInt32 неявно типизируется как динамический, если возвращаемый тип GetNullableInt32 явно возвращает Nullable?
  • Почему базовый тип Nullable не сохраняется? Почему вместо этого используется динамический{int}?


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

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