Как использовать ковариацию (ключевое слово out)? Понятия не имею.
Я знаю, что ключевое слово out в интерфейсе означает ковариацию, которая позволяет вам использовать более производный тип, чем тот, который указан в общем параметре. Поэтому я установил универсальный объект и тип возвращаемого значения для строки. Потому что строка является подклассом объекта. Но я пробовал, и это не работает.
public interface IMyInterface<out T>
{
public T Foo();
}
public class CovarianceTest : IMyInterface<object>
{
public string Foo()
{
return "abc";
}
}
Я подозреваю, что вы пытаетесь сделать следующее.
public interface IMyInterface<out T>
{
public T Foo();
}
public class CovarianceTest : IMyInterface<string>
{
public string Foo()
{
return "abc";
}
}
IMyInterface<string> works = new CovarianceTest();
IMyInterface<object> alsoWorks = new CovarianceTest();
IMyInterface<int> doesNotWork = new CovarianceTest();
Ковариация, позволяющая использовать более производный тип, чем указанный в универсальном параметре.
Это не то, что это значит. Вам все равно придется писать методы, соответствующие типам в интерфейсе. Итак, вам придется сделать это:
public class CovarianceTest : IMyInterface<string>
{
public string Foo()
{
return "abc";
}
}
Ковариация позволяет вам присвоить экземпляр класса переменной, типизированной как менее конкретный интерфейс, например:
IMyInterface<object> x = new CovarianceTest();
Console.WriteLine(x.Foo());
Это связано с тем, что все T
, прочитанные из интерфейса (т. е. взятые out
), гарантированно будут экземплярами, совместимыми по типу с менее конкретным типом, т. е. все строки также являются объектами.
Пожалуйста, публикуйте свой код и сообщения об ошибках только в виде скопированного текста (не изображений/ссылок).