Беда с приведением типа - PullRequest
       21

Беда с приведением типа

2 голосов
/ 03 февраля 2012

Я столкнулся с проблемой, из-за которой я не могу привести свой класс к его родительскому типу и не уверен, почему это означает, что конечный продукт одинаков ... Это потому, что класс абстрактный или из-за универсального типа указано в конструкторе? Тем не менее, я бы подумал, что ограничение на класс решило бы это?

Извините, если я не объяснил это хорошо, но я думаю, что код ниже может продемонстрировать проблему более подробно.

Заранее спасибо, Онам.

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();
    }
}

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Я предполагаю, что вы получаете ошибку от Factory.Get<T>().У вас есть ограничение, согласно которому T должен наследоваться от WarrantyClaimBase, но вы возвращаете более конкретный тип.Подумайте о том, что произойдет, если я напишу:

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

Код действителен, поскольку SomeOtherWarrantyType наследуется от WarrantyClaimBase, но TestClaimRepository явно не может быть приведен к ClaimRepository<SomeOtherWarrantyType>.Я бы предложил изменить ваше определение Get() на, так как вы все равно не используете T:

public ClaimRepository<WarrantyClaimBase> Get() { }
1 голос
/ 03 февраля 2012

Я предполагаю, что вы получаете ошибку компиляции здесь:

public ClaimRepository<WarrantyClaimBase> Get()
{
    return new TestClaimRepository();
}

Проблема в том, что TestClaimRepository наследуется от ClaimRepository<GWMWarrantyClaim>, который не наследуется от ClaimRepository<WarrantyClaimBase>.

Фактически, ClaimRepository<GWMWarrantyClaim> наследуется от объекта и не более связан с ClaimRepository<WarrantyClaimBase>, чем с string с точки зрения иерархии наследования.

Похоже, вы предполагаете, что T : U подразумеваетM<T> : M<U> для универсального типа M. Это никогда не относится к классам.(Если бы ClaimRepository был интерфейсом, вы могли бы избежать этого. Я рекомендую прочитать о ковариации в .NET)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...