无法对Nullable类型的空引用执行运行时绑定

时间:2016-09-15 00:36:45

标签: c# .net dynamic

所以我搜索了SO上的其他NullReferenceException和运行时绑定问题,但无法找到答案。

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

  

' Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'发生在   System.Core.dll

     

其他信息:无法对null执行运行时绑定   参考

代码:

    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;
    }

我错过了一些非常明显的东西吗?或者这是动态的限制?如果是后者,有人知道这个的根本原因吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

Guid? guid = myClass.MyGuid;

Console.WriteLine(guid.HasValue);