Скажем, у меня есть следующие модели:Можете ли вы удовлетворить интерфейс с IEnumerable <T> с помощью списка <T>?
public interface IProduct
{
IEnumerable<Ingredient> Ingredients { get; set; }
}
public class Product : IProduct
{
public IEnumerable<Ingredient> Ingredients { get; set; }
}
public class Ingredient
{
}
Но я хочу Ingredients
, чтобы быть List<Ingredient>
вместо IEnumerable<Ingredient>
Есть ли способ моделировать интерфейс принимать IEnumerable<T>
и List<T>
?
Я пробовал следующее. Но, конечно, синтаксис не поддерживает это и не видит TEnumerable<Ingredient>
в качестве общего параметра.
public interface IProduct<TEnumerable<Ingredient>>
where TEnumerable<Ingredient> : IEnumerable<Ingredient>
{
TEnumerable<Ingredient> Ingredients { get; set; }
}
public class Product : IProduct
{
public List<Ingredient> Ingredients { get; set; }
}
public class Ingredient
{
}
Я понимаю, что это не очень практично, но я просто смотрю на это с любопытством.
Помните LSP. Причина, по которой вы не можете сделать это напрямую, заключается в том, что вы не могли сказать, назовите 'new Product(). Ingredients = Enumerable.Empty()'. То есть подкласс будет нарушать его интерфейс, который говорит '(новый продукт() как IProduct) .Ingredients = Enumerable.Empty ()' должен быть действительным. –
millimoose