C# 铸字困难

C# 铸字困难,c#,generics,casting,C#,Generics,Casting,我遇到了一个问题,我无法将我的类转换为它的父类型,并且不确定为什么这会考虑最终产品是相同的。。。是因为类是抽象的还是因为构造函数中指定的泛型类型?然而,我认为对类的约束会解决这个问题吗 如果我没有很好地解释这一点,很抱歉,但我认为下面的代码可能会更详细地说明这个问题 先谢谢你,欧南 public abstract class ClaimRepository<T> where T : WarrantyClaimBase { public ClaimRepository()

我遇到了一个问题,我无法将我的类转换为它的父类型,并且不确定为什么这会考虑最终产品是相同的。。。是因为类是抽象的还是因为构造函数中指定的泛型类型?然而,我认为对类的约束会解决这个问题吗

如果我没有很好地解释这一点,很抱歉,但我认为下面的代码可能会更详细地说明这个问题

先谢谢你,欧南

public abstract class ClaimRepository<T> where T : WarrantyClaimBase 
{
    public ClaimRepository()
    { }

    public ClaimRepository(bool IncludeLabour, bool IncludeFranchiseLabour)
    {
    }

    protected abstract void GetFranchiseLabour();
}

public class TestClaimRepository : ClaimRepository<GWMWarrantyClaim>
{
    public TestClaimRepository()
    { }
    protected override void GetFranchiseLabour()
    {
        MessageBox.Show("Custom Implementation");
    }
}

public sealed class Factory
{
    public Factory()
    { }

    public ClaimRepository<WarrantyClaimBase> Get()
    {
        return new TestClaimRepository();
    }
}
公共抽象类ClaimRepository,其中T:WarrantyClaimBase
{
公共索赔存储库()
{ }
公共索赔存储库(bool IncludeLabour,bool includeFranchesLabour)
{
}
受保护的抽象数据无效(0);
}
公共类TestClaimRepository:ClaimRepository
{
公共TestClaimRepository()
{ }
受保护的覆盖无效(0)
{
MessageBox.Show(“自定义实现”);
}
}
公共密封级工厂
{
公共工厂()
{ }
公共ClaimRepository Get()
{
返回新的TestClaimRepository();
}
}

我猜您从
工厂得到一个错误。Get()
。您有一个约束,该约束表示T必须从ArgustyCambase继承,但您返回的是一个更具体的类型。想想如果我写下:

var factory = new Factory();
factory.Get<SomeOtherWarrantyType>();

我猜您从
Factory.Get()
中得到了一个错误。您有一个约束,该约束表示T必须从ArgustyCambase继承,但您返回的是一个更具体的类型。想想如果我写下:

var factory = new Factory();
factory.Get<SomeOtherWarrantyType>();

我假设您在这里遇到编译错误:

public ClaimRepository<WarrantyClaimBase> Get()
{
    return new TestClaimRepository();
}
publicClaimRepository Get()
{
返回新的TestClaimRepository();
}
问题是
TestClaimRepository
继承自
ClaimRepository
,而不是继承自
ClaimRepository

事实上,
ClaimRepository
继承自对象,从继承层次结构的角度来看,它与
ClaimRepository
的关系并不比与
string
的关系大


对于泛型类型M,您似乎假设
T:U
意味着
M:M
。对于类来说,这是不正确的。(如果ClaimRepository是一个接口,那么您可能可以避开这个问题。我建议您阅读.NET中的协方差)

我假设您在这里遇到了编译错误:

public ClaimRepository<WarrantyClaimBase> Get()
{
    return new TestClaimRepository();
}
publicClaimRepository Get()
{
返回新的TestClaimRepository();
}
问题是
TestClaimRepository
继承自
ClaimRepository
,而不是继承自
ClaimRepository

事实上,
ClaimRepository
继承自对象,从继承层次结构的角度来看,它与
ClaimRepository
的关系并不比与
string
的关系大


对于泛型类型M,您似乎假设
T:U
意味着
M:M
。对于类来说,这是不正确的。(如果ClaimRepository是一个接口,那么您可能可以不受影响。我建议您阅读.NET中的协方差)

您得到的确切错误是什么?这是编译错误还是运行时错误?为什么在任何地方都不使用t时类是泛型的?我假设
GWMWarrantyClaim
继承自
warrantycaimbase
?@Strillo它必须继承,因为抽象类也有该约束。为什么
工厂
不是静态的?您得到的确切错误是什么?这是编译错误还是运行时错误?为什么在任何地方都不使用t时您的类是泛型的?我假设
GWMWarrantyClaim
继承自
warrantycaimbase
?@Strillo它必须继承,因为抽象类也有这个约束。为什么
工厂
不是静态的?+1很好的解释,没有理由使用泛型是的,是Factory.Get()方法引起了我的问题,但通过将其更改为返回ClaimRepository,它并没有返回我实际需要的类型。。。我认为,因为TestClaimRepository继承了ClaimRepository,所以它应该是可强制转换的?@Onam-您可以将TestClaimRepository强制转换为GuarantyCambase,但在我的示例中……您不能将TestClaimReository强制转换为ClaimRepository,这是运行我的示例时会发生的情况。考虑到它是从它继承的,为什么不允许这样做?我可以用另一种方式,将这些约束放在方法上,而不是类上,但这对我来说似乎更清晰了…+1很好的解释,没有理由在这种情况下使用泛型参数。是的,这是工厂。Get()方法,但通过将其更改为返回ClaimRepository,它并没有返回我实际需要的类型。。。我认为,因为TestClaimRepository继承了ClaimRepository,所以它应该是可强制转换的?@Onam-您可以将TestClaimRepository强制转换为GuarantyCambase,但在我的示例中……您不能将TestClaimReository强制转换为ClaimRepository,这是运行我的示例时会发生的情况。考虑到它是从它继承的,为什么不允许这样做?我可以用一种不同的方式,将这些约束放在方法上,而不是类上,但这对我来说似乎更清晰。。。