c# - 是否可以使用不同的变量类型设置类变量
问题描述
是否可以设置 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++/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
。
推荐阅读
- java - 使用 authzforce 在包中添加多个值
- python - 如何向 tf-idf 矩阵添加新功能
- c++ - 如何为 wxWidgets 编写 GUI 测试
- mongodb - mongo-cxx 驱动程序的奇点配方
- html - 有谁知道为什么 html 的 xampp 图像问题
- flutter - 使用动态数据构建页面时,setState() 不会刷新我的小部件树
- xcode - 在iOS ionic中条纹不完整的付款
- python - 尝试从 Python 执行 SQL 查询时出现 KeyError
- visual-c++ - 代码分析和 constexpr 函数 - 这个函数是一个很好的候选者吗?
- r - 为闪亮的仪表板创建登录页面