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
Ответы
Ответ 1
Я попытался найти причину такого поведения, я потерпел неудачу.
Я нашел обходное решение. Код, который вы опубликовали, компилируется, когда ValidatorBase<T>
не является абстрактным. Я знаю, что вы не можете его изменить, но вы можете добавить еще один неабстрактный класс в цепочку наследования:
public class Workaround<T> : ValidatorBase<T> { }
public class Required : Workaround<object>
{
}
Похоже, что Roslyn не разрешает переопределенные методы в абстрактных классах, пока не будет определен не абстрактный абстрактный класс.