DateTime 问题 - 对象外部可用但内部不可用的值

Posted

技术标签:

【中文标题】DateTime 问题 - 对象外部可用但内部不可用的值【英文标题】:DateTime issue - value available outside object but not inside 【发布时间】:2011-04-27 00:31:09 【问题描述】:

这是一个非常令人沮丧和奇怪的问题,如果您能就如何解决这个问题提供任何建议,我将不胜感激。

我有一个带有私有变量的对象:

private DateTime _maturityDate = DateTime.MaxValue;

它有一个对应的属性:

public DateTime MaturityDate  get; set; 

我有一个方法可以更新数据库中的数据,称为 UpdateInstrumentBase()。该属性是从 Windows 窗体上的 DateTimePicker 控件设置的。它是通过代码设置的,而不是通过数据绑定:

((Instrument)instrumentBS.DataSource).MaturityDate = dateTimePicker9.Value;

这正确设置了值:

(我不能发布图片,所以你必须相信我会这样做)

但是 - 这是真正奇怪的问题 - 当您进入对象时,这就是属性设置的内容。即使尝试在即时窗口中或使用 console.writeline 输出它也会导致以下结果:

? _maturityDate System.DateTime 日期:无法评估表达式,因为线程在某个点停止 垃圾收集在哪里 不可能,可能是因为代码 已优化。

我尝试将日期值作为字符串传递,然后转换为 DateTime 作为一种解决方法,但是对 ANY DateTime 属性或变量的任何访问 - 不仅仅是这个 - 在这个对象内都会导致这个错误。我搜索了高低,但我什至不确定此错误消息是否相关或有用。

如果相关,我在 Visual Studio 2008 版本 9.0.21022.8 中使用 .NET Framework 3.5 SP1。

我被难住了。该对象非常复杂,因此我不愿发布整个内容,但如果有人有任何想法,我将发布相关代码。

提前致谢!

【问题讨论】:

“对象相当复杂”——通常表明你做错了...... 在调试器中使用Console.WriteLine notnot 给出该结果。你还没有描述不调试时出现了什么问题。 很遗憾,同意奥斯汀。尝试使用具有上述DateTime 属性的类创建一个简单的独立项目,并确保它正常工作。我从来没有见过你用简单属性(DateTime 或其他)描述的问题,所以它可能是你的类复杂性的一个奇怪的副产品。 我的意思是它有很多很多属性,并不是说它很复杂。这不是真的 - 它只是存储值。 项目中的其他对象确实正确存储了 DateTime 值。 【参考方案1】:

这不是您的代码中的错误。这里发生的情况是 C# 调试器正在尝试评估一个表达式,并从 CLR 获取返回值 CORDBG_E_ILLEGAL_AT_GC_UNSAFE_POINTCORDBG_E_ILLEGAL_IN_OPTIMIZED_CODE。这些是错误代码,表明无法在当前上下文中评估表达式,并且与实际用户代码几乎没有关系。

Mike Stall 对这些消息以及它们发生的原因进行了很好的细分,这可能值得一读。

http://blogs.msdn.com/b/jmstall/archive/2005/11/15/funceval-rules.aspx

很遗憾,尽管您几乎无法解决这个问题。除非问题是您正在调试优化,在这种情况下关闭优化将解决问题。

【讨论】:

啊哈。现在我知道“funceval 是邪恶的”,这似乎更清楚了。 @Matt,funceval 不是纯粹的邪恶。这就像一个善意的朋友,只是不可避免地一次又一次地搞砸情况;)【参考方案2】:

观察:

根据您在上面发布的内容,

public DateTime MaturityDate get;放;

是一个自动属性 ​​(http://msdn.microsoft.com/en-us/library/bb384054.aspx),应该与 _maturityDate 没有关联。

我错过了什么吗?

【讨论】:

以上是关于DateTime 问题 - 对象外部可用但内部不可用的值的主要内容,如果未能解决你的问题,请参考以下文章

在方法中定义的内部类称为局部内部类

成员内部类不可以有静态属性

Java内部类持有外部类的引用详细分析与解决方案

TypeError:“datetime.date”对象不可下标

是否有办法知道对象内部是否具有不可迭代的NoneType对象

Android存储及getCacheDir()getFilesDir()getExternalFilesDir()getExternalCacheDir()区别