找回密码
 立即注册

QQ登录

只需一步,快速开始

chentiancai

中级会员

4

主题

17

帖子

529

积分

中级会员

积分
529

活字格认证

最新发帖
chentiancai
中级会员   /  发表于:2012-3-22 21:54  /   查看:20258  /  回复:8
“可为空的对象必须具有一个值”??这是什么原因啊??。。C#不是很了解。。。求指点。。。在线等啊

8 个回复

倒序浏览
Iver
版主   /  发表于:2012-3-23 09:38:00
沙发
你好,:
你遇到的问题,应该是将一个未赋值的可空类型变量强制转换成其对应的值类型,或者直接使用了其值类型的成员,像以下两种写法都会导致这种问题:
(假设有一个int? i)
  1. int j = (int)i;
  2. string s = i.ToString();
复制代码
正确的写法是在使用可空变量时,先判断其是否已被赋值,而且通过其成员Value来访问其值:
  1. if(i.HasValue)
  2. {
  3.   int j = i.Value;
  4.   string s = i.Value.ToString();
  5. }
  6. else
  7. {
  8.   //...
  9. }
复制代码
回复 使用道具 举报
魔都阿三
论坛元老   /  发表于: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
5#

回复 4# Iver 的帖子

谢啦
回复 使用道具 举报
chentiancai
中级会员   /  发表于:2012-3-23 17:30:00
6#
谢谢版主。。。那这种错误能调试出来不?就是确定它在哪儿出错。。。
回复 使用道具 举报
Iver
版主   /  发表于:2012-3-23 17:57:00
7#

回复 6# chentiancai 的帖子

你好,chentiancai:
首先,你应该保证在你的代码里,所有对可空类型变量的使用,都先检查HasValue,再进行相关的处理。
其次,如果你在调试时,想定位到出错的代码行,可以进行如下设置:
在编辑或调试下,按Ctrl+D,E,出现Exceptions对话框,将第二项,Common Language Runtime Exceptions后面的复选框选中。
回复 使用道具 举报
chentiancai
中级会员   /  发表于:2012-3-23 18:12:00
8#
嗯。。谢谢版主!我把该行后面两个方框都选中了,然后得在单步调试下才能定位吗?它没有直接显示是哪一行出了这个错误。跟原来一样,就是运行着突然给出“可空的对象必须具有一个值”错误提示。。。
ReadOnlyCollection<IConstruction>可不可能引发这种错误啊?
现在我PlayerID?这种可空类型是没有用的,也没有使用其他的可空类型。。。就是这个ReadOnlyCollection<IConstruction>感觉有问题。。。
再次谢谢啊。。
回复 使用道具 举报
chentiancai
中级会员   /  发表于:2012-3-23 18:56:00
9#
版主我错了。。。原来是不小心让程序进入了死循环。。。呜呼哀哉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部