使用 T 实现仅包含 get 属性 的接口?针对具有 属性 T 的具体类型

Implementing interface containing a get only property with T? against a concrete type with property T

这个问题很难描述,如果之前有人回答过,我深表歉意。我正在使用 DateTimeDateTime? 类型来说明问题,但我的问题并不特定于 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;
    }
}

鉴于 DateTimeDateTime? 的子集(根据定义,任何 T 都是 T? 的子集),并且 IPotentiallyOpenDateRange 确实没有 setter,我有两个问题:

  1. 为什么不允许这样做?;和
  2. 有没有一种方法可以实现 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;