c#强制转换创建不需要的属性

c#强制转换创建不需要的属性,c#,casting,C#,Casting,我有一个接口 public interface IHaveCreateDate { DateTime CreateDate { get; set; } } 接下来,我有一节课 公家犬 { } 现在,我的狗没有创建日期。如果我把我的狗投给IHaveDate,我就能看到一个价值: ((new Dog()) as IHaveCreateDate).CreateDate //Displays: {1/1/0001 12:00:00 AM} 我希望由于dog没有CreateDate,所以不能将

我有一个接口

public interface IHaveCreateDate
{
    DateTime CreateDate { get; set; }
}
接下来,我有一节课 公家犬 { }

现在,我的狗没有创建日期。如果我把我的狗投给IHaveDate,我就能看到一个价值:

((new Dog()) as IHaveCreateDate).CreateDate //Displays: {1/1/0001 12:00:00 AM}
我希望由于dog没有CreateDate,所以不能将其强制转换为IHaveDate,因此强制转换应该返回null。但是,强制转换会“创建”一个新属性,将其初始化为默认值,然后分配给对象。有人能指出c#文档中暗示这种行为的地方吗?我读过,没有发现任何暗示这一点或相关的东西

更新:

我想我知道发生了什么,但只是为了提供一个解释,添加了我所看到的屏幕截图

因此,我正在查看这个目标对象,它没有LastModifiedDate属性,如监视窗口中所示

但是转换到IDateVersionIdentity接口(它只有一个日期属性)成功了。这让我感到困惑,如果LastModifiedDate本身甚至不是目标对象上的属性,它从何而来


结果是Waayy。。在调用此方法之前,目标曾经是一个具有此属性的对象,但被强制转换为不再公开它的其他接口。应该是显而易见的!所以我的错。谢谢您的时间。

无法通过强制转换向类添加任何内容:您错误地解释了调试器中的错误

一旦您将操作员
作为
应用于未实现所需接口的
,您将立即得到一个
null
。从那时起,任何试图引用一个字段的操作都会导致崩溃()


但是,调试器很宽松,因此它不会向您报告崩溃,而是生成默认值
DateTime
,这是一种值类型。

也许您的
Dog
类继承自实现了
IHaveCreateDate
接口的类

public class Dog : Animal
{}

public class Animal : IHaveCreateDate // IHaveBirthDate would be more suitable here ;-)
{
    DateTime CreateDate { get; set; }
}

这是因为datetime是valuetype,请使用可为空的datetime您是在调试器中看到这一点,还是实际允许程序运行(该程序会崩溃)?请显示
Dog
的声明<如果
Dog
未实现
IHaveDate
,则CreateDate将抛出
NullReferenceException
,因为
(new Dog())作为IHaveDate
将返回
null
@crush
,因为
未抛出异常(除非.NET运行时在灾难性故障中彻底丢失),否则如果对象实际上没有实现/继承其他类型,它只会返回
null
。@crush相反,这是一个非常好的主意。您可以这样做:
var disposable=someObject as IDisposable;if(disposable!=null)disposable.Dispose()
这将执行1次强制转换,而不是2次。在C#6.0中,此代码变得更短:
(将某个对象作为IDisposable)?.Dispose();
仍然是1次强制转换,而不是2次。当我运行
.CreateDate()时,调试器将如何宽松
强制转换为null导致
null引用异常
调试器没有时间宽大处理在调试器中的何处观察到此行为?我在尝试、观察、快速观察、即时窗口时都会收到null引用异常。当然,这是Visual Studio 2015,但我从未见过此行为。@LasseV.Karlsen同样,在VS 2010或VS 2013中,我也无法在CreateDate中显示任何内容。我的猜测是,询问者误读了调试器,并看到了这样的情况:或者他没有在问题中提供正确的信息。@AnthonyPegram是的,这似乎很有可能。