gpt4 book ai didi

c# - 无法对可空类型的空引用执行运行时绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 23:21:01 33 4
gpt4 key购买 nike

所以我在 SO 上搜索了其他 NullReferenceException 和运行时绑定(bind)问题,但找不到这个问题的答案。

基本上,我有下面的代码。正如您所期望的那样,ManipulateConcrete 方法返回 False,但是 Manipulate 方法抛出

'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll

Additional information: Cannot perform runtime binding on a null reference

代码:

    class Program
{
static void Main(string[] args)
{
var myClassInstance = new MyClass() { MyGuid = null };

ManipulateConcrete(myClassInstance);
Manipulate(myClassInstance);
Console.ReadLine();
}

static void Manipulate(dynamic myClass)
{
Console.WriteLine(myClass.MyGuid.HasValue);
}

static void ManipulateConcrete(MyClass myClass)
{
Console.WriteLine(myClass.MyGuid.HasValue);
}

}

class MyClass
{
public Guid? MyGuid;
}

我是否漏掉了一些非常明显的东西?或者这是动态的限制?如果是后者,有谁知道这背后的原因吗?

最佳答案

当使用dynamic 时,不考虑静态类型。因此,在 Manipulate 中,myClass.MyGuid 的值为 null,类型为 dynamic。并且 dynamic 不知道如何访问 null 实例上的任何属性,所以它会抛出。

解决此问题的一种方法是与 null 进行比较,而不是使用 .HasValue:

Console.WriteLine(myClass.MyGuid != null);

另一种选择是通过转换为 Guid? 来摆脱 dynamic:

Guid? guid = myClass.MyGuid;

Console.WriteLine(guid.HasValue);

关于c# - 无法对可空类型的空引用执行运行时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39501592/

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