使用 T 实现仅包含 get 属性 的接口?针对具有 属性 T 的具体类型
Implementing interface containing a get only property with T? against a concrete type with property T
这个问题很难描述,如果之前有人回答过,我深表歉意。我正在使用 DateTime
和 DateTime?
类型来说明问题,但我的问题并不特定于 DateTime(可以是任何 T
/T?
)。
我有一个 IPotentiallyOpenDateRange
的接口,如下所述。 End 是一个只能获取的可为 null 的 DateTime。
public interface IPotentiallyOpenDateRange
{
DateTime Start
{
get;
}
DateTime? End
{
get;
}
}
如果我创建一个具体的 class OpenRange
(下图),一切都会按预期进行
public class OpenRange : IPotentiallyOpenDateRange
{
public DateTime Start
{
get;
set;
}
public DateTime? End
{
get;
set;
}
}
但是编译器不会接受下面的ClosedRange
实现
public class ClosedRange : IPotentiallyOpenDateRange
{
public DateTime Start
{
get;
set;
}
public DateTime End
{
get;
set;
}
}
鉴于 DateTime
是 DateTime?
的子集(根据定义,任何 T
都是 T?
的子集),并且 IPotentiallyOpenDateRange
确实没有 setter,我有两个问题:
- 为什么不允许这样做?;和
- 有没有一种方法可以实现
ClosedRange
以满足 IPotentiallyOpenDateRange
?
类型必须匹配 class 才能实现接口。实施不允许隐式转换。
不过交通方便。
试试这个:
public class ClosedRange : IPotentiallyOpenDateRange
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
DateTime? IPotentiallyOpenDateRange.End
{
get
{
return this.End;
}
}
}
或者像这样更简洁:
DateTime? IPotentiallyOpenDateRange.End => this.End;
这个问题很难描述,如果之前有人回答过,我深表歉意。我正在使用 DateTime
和 DateTime?
类型来说明问题,但我的问题并不特定于 DateTime(可以是任何 T
/T?
)。
我有一个 IPotentiallyOpenDateRange
的接口,如下所述。 End 是一个只能获取的可为 null 的 DateTime。
public interface IPotentiallyOpenDateRange
{
DateTime Start
{
get;
}
DateTime? End
{
get;
}
}
如果我创建一个具体的 class OpenRange
(下图),一切都会按预期进行
public class OpenRange : IPotentiallyOpenDateRange
{
public DateTime Start
{
get;
set;
}
public DateTime? End
{
get;
set;
}
}
但是编译器不会接受下面的ClosedRange
实现
public class ClosedRange : IPotentiallyOpenDateRange
{
public DateTime Start
{
get;
set;
}
public DateTime End
{
get;
set;
}
}
鉴于 DateTime
是 DateTime?
的子集(根据定义,任何 T
都是 T?
的子集),并且 IPotentiallyOpenDateRange
确实没有 setter,我有两个问题:
- 为什么不允许这样做?;和
- 有没有一种方法可以实现
ClosedRange
以满足IPotentiallyOpenDateRange
?
类型必须匹配 class 才能实现接口。实施不允许隐式转换。
不过交通方便。
试试这个:
public class ClosedRange : IPotentiallyOpenDateRange
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
DateTime? IPotentiallyOpenDateRange.End
{
get
{
return this.End;
}
}
}
或者像这样更简洁:
DateTime? IPotentiallyOpenDateRange.End => this.End;