所以我搜索了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;
}
我错过了一些非常明显的东西吗?或者这是动态的限制?如果是后者,有人知道这个的根本原因吗?
答案 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);