.net 为什么跟踪引用不为被引用对象指定值?

.net 为什么跟踪引用不为被引用对象指定值?,.net,c++-cli,tracking-reference,.net,C++ Cli,Tracking Reference,我不明白,当传递的变量在堆上时,为什么跟踪引用没有完成它的工作。代码如下: ref class DataContainer { public: property DateTime Time; }; DataContainer^ dc = gcnew DataContainer (); DateTime timeOnStack; // first call with output variable on the stack bool timeParsed

我不明白,当传递的变量在堆上时,为什么跟踪引用没有完成它的工作。代码如下:

ref class DataContainer
    {
    public:
        property DateTime Time;
    };

DataContainer^ dc = gcnew DataContainer ();
DateTime timeOnStack;
// first call with output variable on the stack
bool timeParsed = DateTime::TryParseExact ("20160104132500184", "yyyyMMddHHmmssfff", CultureInfo::InvariantCulture, DateTimeStyles::None, timeOnStack);
// second call with output variable on the heap
timeParsed = DateTime::TryParseExact ("20160104132500184", "yyyyMMddHHmmssfff", CultureInfo::InvariantCulture, DateTimeStyles::None, (dc->Time));
第一个
TryParseExact
调用使用本地初始化变量
timeOnStack
放入解析的日期时间值,按预期工作并正确设置解析的日期:调用
timeOnStack.ToString()
返回
“1/4/2016 1:25:00 PM”
而第二个函数甚至返回
true
它没有将正确的值设置为
dc->Time
:call
dc->Time.ToString()
返回
“1/1/0001 12:00:00 AM”


这里我没有看到什么?

传递跟踪引用(
ref
在C#中)是传递对象的本地存储地址,而不是传递对象。但是,在您的示例中,
dc->Time
不是局部变量或字段,而是属性。请记住,在后台,属性是getter/setter方法对。这里的内容相当于
dc->GetTime()

编译器正在接受您的方法调用,并将该方法调用的结果作为跟踪引用传递。没有将其转让回财产;这不是它的工作原理。接收方法调用结果并作为跟踪引用传递的临时局部变量不可用

如果您在C#中尝试此操作,您将得到一个错误
属性或索引器可能无法作为out或ref参数传递。
C++/CLI允许执行此操作,但可能不是您所希望的


编译器可以选择实现一些语法糖:调用属性getter,分配给临时变量,然后调用setter。但是,C#和C++/CLI都选择不实现该功能,原因很充分:请参阅

传递跟踪引用(
ref
在C#中)是传递对象的本地存储地址,而不是传递对象。但是,在您的示例中,
dc->Time
不是局部变量或字段,而是属性。请记住,在后台,属性是getter/setter方法对。这里的内容相当于
dc->GetTime()

编译器正在接受您的方法调用,并将该方法调用的结果作为跟踪引用传递。没有将其转让回财产;这不是它的工作原理。接收方法调用结果并作为跟踪引用传递的临时局部变量不可用

如果您在C#中尝试此操作,您将得到一个错误
属性或索引器可能无法作为out或ref参数传递。
C++/CLI允许执行此操作,但可能不是您所希望的

编译器可以选择实现一些语法糖:调用属性getter,分配给临时变量,然后调用setter。但是,C#和C++/CLI都选择不实现该功能,原因很充分:请参阅