首页 > 解决方案 > 是否可以使用不同的变量类型设置类变量

问题描述

是否可以设置 ac# 变量的变量类型值与变量设置的值不同?

public class Test{

   public DateTime TimeSinceEpoch {
      get {return TimeSinceEpoch; }
      set{ 
         DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
         TimeSinceEpoch = Epoch.AddMilliseconds(value);}} //<-the value that's expected is a DateTime value..
}

我该如何写:'TimeSinceEpoch = 1549090800000' 并将 TimeSinceEpoch 用作普通的 DateTime 变量?

无需在类中单独获取和设置变量

标签: c#class

解决方案


即使在确实有语法的 C++/CLI 中也不允许这样做:

public ref struct Test
{
    property System::DateTime TimeSinceEpoch
    {
        DateTime get();
        void set(DateTime);
        void set(long long);
    }
};

您收到以下错误:

错误 C3902:'set':最后一个参数的类型必须是 'System::DateTime'

Intellisense 实际上会产生两个投诉,具体取决于您编写它们的顺序:

E1930: 已经为此属性声明了一个 'set' 访问器

或者

E1942: 'set' 访问器的最后一个参数与属性类型不匹配

根本问题是 .NET 属性必须在元数据中列出一个类型和最多一个 setter(看看PropertyInfo.GetSetMethod——它返回一个 setter 或null,而不是数组)。即使您可以轻松地重载 setter 函数本身:

void set_TimeSinceEpoch(DateTime)
void set_TimeSinceEpoch(long)

这两个函数中只有一个可以与该属性相关联。

您可以使用辅助类型来允许多种传入类型:

struct SuperDateTime
{
    public DateTime Value;
    public static implicit operator SuperDateTime(DateTime d) { return new SuperDateTime { Value = d }; }
    public static implicit operator SuperDateTime(long x) { return new SuperDateTime { Value = Epoch.AddMilliseconds(x) }; }
    public static implicit operator DateTime(SuperDateTime d) { return d.Value; }
}

但这会破坏属性的读者,他们现在必须TimeSinceEpoch.Value在使用成员之前说(如果作为参数传递给另一个函数,隐式转换将启动)。为了克服这个问题,您需要为每个成员编写一个转发函数DateTime


推荐阅读