继承和返回类型

时间:2013-09-23 16:34:47

标签: c# .net

多年来,这一直是我沮丧的根源。我的理解是,当一个类继承或从另一个基类派生时,它可以从一个方法返回,该方法的签名指定基类作为它的返回值。根据定义,衍生类必须是基类,所以应该没有问题。这对我不起作用,从来没有为我工作,所以我一直在寻找解决办法,而不是理解为什么这是不正确的以及“正确”的解决方案是什么。

public abstract class Contract
{
    [Key]
    [DataMember]
    [Column("Id")]
    public Int64 Id { get; set; }

    [DataMember]
    [Column("ContactName")]
    [DataType(DataType.Text)]
    public String ContactName { get; set; }

    [DataMember]
    [DataType(DataType.EmailAddress)]
    [Column("ContactEmail")]
    public String ContactEmail { get; set; }

    [DataMember]
    [DataType(DataType.Text)]
    [Column("ContactAddress1")]
    public String ContactAddress1 { get; set; }

    ... More properties
}


public class StorageContract : Contract
{

    [DataMember]
    [Column("BoatMaxWidth")]
    public Decimal? BoatMaxWidth { get; set; }

    [DataMember]
    [ColumnAttribute("WidthUOM")]
    [DataType(DataType.Text)]
    public String WidthUOM { get; set; }

    [DataMember]
    [Column("LaunchDate")]
    [DataType(DataType.Date)]
    public DateTime? LaunchDate { get; set; }

    [DataMember]
    [Column("TotalCharge")]
    public Decimal? TotalCharge { get; set; }

    ... More properties
}


public class RentalContract : Contract
{
    [DataMember]
    [Column("BoatMake")]
    public String BoatMake { get; set; }

    [DataMember]
    [Column("BoatYear")]
    public Int32? BoatYear { get; set; }

    [DataMember]
    [Column("BoatBeam")]
    public Decimal? BoatBeam { get; set; }

    [DataMember]
    [Column("BoatType")]
    [DataType(DataType.Text)]
    public String BoatType { get; set; }

    ... More properties
}

那为什么这不起作用......

    public List<Contract> lvContractList_GetData()
    {
        List<Contract> ret = null;
        switch (Request.QueryString["type"].ToLower())
        {
            case "storage":
                ret = ContractRepository2.GetAllContracts<StorageContract>().ToList();
                    break;
            case "rental":
                ret = ContractRepository2.GetAllContracts<RentalContract>().ToList();
                    break;
            }
        }

        return ret;
    }

StorageContract和RentalContract都是从Contract类派生的,这使得它们也成为Contract对象。

为什么我不能这样做?

0 个答案:

没有答案
相关问题