Подтвердить что ты не робот

Visual Studio 2015 не компилируется, когда тип общего типа соответствует перегруженному методу, который принимает этот тип

Мой проект компилируется в VS 2013, но не компилируется в VS 2015. Ниже кода воспроизводится проблема компиляции. Классы Validator фактически находятся в сторонней сборке, поэтому я не могу изменить реализацию. Класс require - это локальный класс, но я не хочу изменять реализацию, потому что мне придется изменить много логики проверки. Ниже приведен код, который не компилируется в VS 2015.

public abstract class Validator<T> : Validator
{
    public override void DoValidate(object objectToValidate)
    {

    }
    protected abstract void DoValidate(T objectToValidate);
}

public abstract class Validator
{
    public abstract void DoValidate(object objectToValidate);
}

public abstract class ValidatorBase<T> : Validator<T>
{
    protected override void DoValidate(T objectToValidate)
    {

    }
}

public class Required : ValidatorBase<object>
{

}

Есть ли способ обхода этой компиляции? Любая помощь будет оценена.

Ошибка:

Severity  Code    Description                                                                                     Project  File        Line

Error     CS0534  'Required' does not implement inherited abstract member 'Validator<object>.DoValidate(object)'           Program.cs  38
4b9b3361

Ответ 1

Я попытался найти причину такого поведения, я потерпел неудачу.

Я нашел обходное решение. Код, который вы опубликовали, компилируется, когда ValidatorBase<T> не является абстрактным. Я знаю, что вы не можете его изменить, но вы можете добавить еще один неабстрактный класс в цепочку наследования:

public class Workaround<T> : ValidatorBase<T> { }

public class Required : Workaround<object>
{

}

Похоже, что Roslyn не разрешает переопределенные методы в абстрактных классах, пока не будет определен не абстрактный абстрактный класс.