Почему мы не можем установить производный тип для общих c параметров? - PullRequest
1 голос
/ 08 мая 2020

В приведенном ниже коде

    public class CustomValidator<T>
    {
        // some code 
    }

    public abstract class Parent
    {
        public CustomValidator<Parent> Validator { get; protected set; }
    }

    public class Child : Parent
    {
        public string Name { get; set; }
        public Child()
        {
            Validator = new CustomValidator<Child>();
            // Doesn't work, cannot cast implicitly 
        }
    }

Поскольку мы можем назначить дочерний элемент родителю, почему мы не можем установить CustomValidator<Child> для свойства типа CustomValidator<Parent>?

1 Ответ

1 голос
/ 08 мая 2020

Вы можете попытаться использовать ковариацию в C#, вводя ковариантный интерфейс, если ваш код позволяет это:

public interface ICustomValidator<out T> // Your new interface
{
    // some code 
}

public class CustomValidator< T>:ICustomValidator<T>
{
    // some code 
}

public abstract class Parent
{
    // Change property to your new interface
    public ICustomValidator<Parent> Validator { get; protected set; }
}

public class Child : Parent
{
    public string Name { get; set; }
    public Child()
    {
        Validator = new CustomValidator<Child>();
    }
}

Если вы не можете создать свой ICustomValidator интерфейс ( пометив параметр generi c ключевым словом out) ковариантным, затем как @ Michael Randall , указанный в комментариях CustomValidator<Parent> != CustomValidator<Child>

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