Dan*_*ani 175 c# nullable invalidoperationexception
异常描述中存在悖论:Nullable对象必须有一个值(?!)
这就是问题:
我有一个DateTimeExtended课,有
{
DateTime? MyDataTime;
int? otherdata;
}
Run Code Online (Sandbox Code Playgroud)
和一个构造函数
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
Run Code Online (Sandbox Code Playgroud)
运行此代码
DateTimeExtended res = new DateTimeExtended(oldDTE);
Run Code Online (Sandbox Code Playgroud)
抛出一条InvalidOperationException消息:
可以为空的对象必须具有值.
myNewDT.MyDateTime.Value- 有效且包含常规DateTime对象.
这条消息的含义是什么?我做错了什么?
请注意,oldDTE不是null.我已经去除了Value从myNewDT.MyDateTime,但相同的异常因抛出一个生成的制定者.
Yul*_*liy 184
您应该将该行更改this.MyDateTime = myNewDT.MyDateTime.Value;为justthis.MyDateTime = myNewDT.MyDateTime;
您收到的异常被抛入Nullable的.Value属性中,因为它需要返回一个(因为那是状态的合同),但它不能这样做因为没有返回,所以它抛出异常. DateTimeDateTime.ValueDateTime
一般来说,盲目地调用.Value可空类型是个坏主意,除非你事先知道该变量必须包含一个值(即通过.HasValue检查).
编辑
这里的代码DateTimeExtended不会抛出异常:
class DateTimeExtended
{
public DateTime? MyDateTime;
public int? otherdata;
public DateTimeExtended() { }
public DateTimeExtended(DateTimeExtended other)
{
this.MyDateTime = other.MyDateTime;
this.otherdata = other.otherdata;
}
}
Run Code Online (Sandbox Code Playgroud)
我测试了这样:
DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);
Run Code Online (Sandbox Code Playgroud)
添加.Valueon other.MyDateTime会导致异常.删除它摆脱了异常.我觉得你在找错了地方.
当使用LINQ扩展方法(例如Select,Where),lambda函数可以被转换为SQL可能不完全相同的行为对你的C#代码.例如,C#的短路评估||并&&转换为SQL的急切AND和OR.当您在lambda中检查null时,这可能会导致问题.
例:
MyEnum? type = null;
Entities.Table.Where(a => type == null ||
a.type == (int)type).ToArray(); // Exception: Nullable object must have a value
Run Code Online (Sandbox Code Playgroud)
为了回答您的实际问题,“可为空对象必须有一个值”是什么意思?
它实际上是在说“您正在尝试获取可为空对象的 .Value,但它为 null,因此无法完成。”。
我认为这是一个写得很糟糕的错误消息。他们可能只是说“可空对象必须有一个值才能获取它的 .Value”
| 归档时间: |
|
| 查看次数: |
223410 次 |
| 最近记录: |