chentiancai 发表于 2012-3-22 21:54:00

可为空的对象必须具有一个值

“可为空的对象必须具有一个值”??这是什么原因啊??。。C#不是很了解。。。求指点。。。在线等啊

Iver 发表于 2012-3-23 09:38:00

你好,:
你遇到的问题,应该是将一个未赋值的可空类型变量强制转换成其对应的值类型,或者直接使用了其值类型的成员,像以下两种写法都会导致这种问题:
(假设有一个int? i)int j = (int)i;
string s = i.ToString();正确的写法是在使用可空变量时,先判断其是否已被赋值,而且通过其成员Value来访问其值:if(i.HasValue)
{
int j = i.Value;
string s = i.Value.ToString();
}
else
{
//...
}

魔都阿三 发表于 2012-3-23 10:41:00

回复 2# Iver 的帖子

IConstruction construction=null
可不可以呢,要检查吗?

Iver 发表于 2012-3-23 11:08:00

回复 3# 魔都阿三 的帖子

你好,魔都阿三:
如果不是可空类型,也就是说不是xxx?的类型的变量,是没有HasValue这个属性的,呵呵。
如果一个变量是引用类型,而不是值类型,那么在使用其成员之前,是有必要检查其指向的引用是否为空的,即判断xx == null。
值类型和引用类型,简单地说就是,常见的类型中,声明为class的都是引用类型,而为struct的都是佱类型。枚举是值类型。
你上面提到的IConstruction是一个引用类型,而在这次的比赛中用到的,如Point和Operation等是值类型。

魔都阿三 发表于 2012-3-23 11:46:00

回复 4# Iver 的帖子

谢啦

chentiancai 发表于 2012-3-23 17:30:00

谢谢版主。。。那这种错误能调试出来不?就是确定它在哪儿出错。。。

Iver 发表于 2012-3-23 17:57:00

回复 6# chentiancai 的帖子

你好,chentiancai:
首先,你应该保证在你的代码里,所有对可空类型变量的使用,都先检查HasValue,再进行相关的处理。
其次,如果你在调试时,想定位到出错的代码行,可以进行如下设置:
在编辑或调试下,按Ctrl+D,E,出现Exceptions对话框,将第二项,Common Language Runtime Exceptions后面的复选框选中。

chentiancai 发表于 2012-3-23 18:12:00

嗯。。谢谢版主!我把该行后面两个方框都选中了,然后得在单步调试下才能定位吗?它没有直接显示是哪一行出了这个错误。跟原来一样,就是运行着突然给出“可空的对象必须具有一个值”错误提示。。。
ReadOnlyCollection<IConstruction>可不可能引发这种错误啊?
现在我PlayerID?这种可空类型是没有用的,也没有使用其他的可空类型。。。就是这个ReadOnlyCollection<IConstruction>感觉有问题。。。
再次谢谢啊。。

chentiancai 发表于 2012-3-23 18:56:00

版主我错了。。。原来是不小心让程序进入了死循环。。。呜呼哀哉
页: [1]
查看完整版本: 可为空的对象必须具有一个值