Я получаю RuntimeBinderException
с сообщениемНазначение динамических свойств Броски RuntimeBinderException
Cannot implicitly convert type 'object' to 'MyNamespace.SomeEnum?'. An explicit conversion exists (are you missing a cast?)
Следующий код генерирует эту ошибку:
public enum SomeEnum
{
Val1
}
public class Example
{
public SomeEnum? EnumMember { get; set; }
}
public static class Program
{
static void Main()
{
dynamic example = new Example();
// Works without issue
example.EnumMember = (dynamic)Enum.Parse(typeof(SomeEnum), "Val1");
// Works without issue
example.EnumMember = Enum.Parse(example.EnumMember.GetType(), "Val1");
// Throws the aforementioned RuntimeBinderException
example.EnumMember = Enum.Parse(typeof(SomeEnum), "Val1");
}
}
Почему для первых двух линий работы (оба типа возврата динамический) , но третий вызывает исключение (когда тип возвращаемого объекта является объектом)? У меня создалось впечатление, что при назначении динамическому связывание выполняется с использованием фактического типа времени выполнения правой стороны. Может ли кто-нибудь рассказать мне, почему третья строка не может работать так, как написано?
Разве это не тип времени компиляции RHS во втором примере 'object', а не' dynamic'? Вот где я застрял - второй и третий звонки кажутся такими же, как и во время компиляции «typeof». –
@DStanley: Нет, потому что вызов динамически связан, потому что первый аргумент использует 'example'.Попробуйте назначить результат вместо 'var' и наведите указатель на объявление, и вы увидите: –
@DStanley Нет, потому что example.EnumMember.GetType() возвращает' dynamic', поэтому выражение Enum.Parse должно, по определению, также возвращаем тип 'dynamic'. –