gpt4 book ai didi

c# - 动态属性分配抛出 RuntimeBinderException

转载 作者:太空宇宙 更新时间:2023-11-03 21:18:13 24 4
gpt4 key购买 nike

我收到一个带有消息的 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");
}
}

为什么前两行有效(都是动态返回类型),但第三行抛出异常(当返回类型是对象时)?我的印象是,当分配给动态时,绑定(bind)是使用右侧的实际运行时类型执行的。能否请教一下为什么第三行写的无法运行?

最佳答案

前两行 = 运算符的 RHS 表达式的编译时类型是 dynamic。在第一种情况下,这是因为您已转换为 dynamic,而在第二种情况下,这是因为您在其中一个参数中使用了动态值。

在第三种情况下,表达式的编译时类型是object。所以你正在尝试做等同于:

object x = Enum.Parse(typeof(SomeEnum), "Val1");
example.EnumMember = x;

那行不通,因为没有从 objectSomeEnum?隐式转换,而这正是编译器试图找到的在执行时。

请注意,可空性部分在这里确实无关紧要——它是一个枚举这一事实也无关紧要。只是赋值运算符是动态绑定(bind)的,但是使用 RHS 的编译时时间。这是一个类似但更简单的示例:

class Test
{
public int Foo { get; set; }

static void Main()
{
dynamic example = new Test();

example.Foo = 10; // Fine

object o = 10;
example.Foo = o; // Bang
}
}

如果您希望编译器使用返回值的实际 类型而不是编译时类型来动态处理赋值,那么使用dynamic 正是您所需要的想要做的 - 要么转换为动态,要么使用:

dynamic value = ...;
target.SomeProperty = value;

关于c# - 动态属性分配抛出 RuntimeBinderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32722997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com