У меня гораздо более сложная проблема, но я свел ее к следующему простому примеру:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sandbox
{
class Program
{
static void Main(string[] args)
{
IFactory<IProduct> factory = new Factory();
}
}
class Factory : IFactory<Product>
{
}
class Product : IProduct
{
}
interface IFactory<T> where T : IProduct
{
}
interface IProduct
{
}
}
Все хорошо и денди... за исключением того, что я получаю эту ошибку.
Ошибка 1 Не удается неявно преобразовать тип Sandbox.Factory
в Sandbox.IFactory<Sandbox.IProduct>
. Существует явное преобразование (вам не хватает приведения?) c:\~~\Program.cs 12 42 Песочница
Кто-нибудь готов дать представление о том, почему это так? Я уверен, что Джон Скит или Эрик Липперт могли бы объяснить, почему это так, но должен быть кто-то, кто не только понимает, ПОЧЕМУ это нельзя вывести, но и может объяснить, как лучше всего разрешить эту ситуацию.
Последующий вопрос здесь
interface + covariance
. - person Anthony Pegram   schedule 17.06.2011List<T>
не является ковариантным, вы не можете рассматриватьList<Product>
какList<IProduct>
, потому чтоList<Product>
не имеет методаAdd(IProduct)
. Однако вы можете вернутьIEnumerable<T>
, и это сработает, посколькуIEnumerable<Product>
можно использовать везде, где ожидаетсяIEnumerable<IProduct>
. - person Ben Voigt   schedule 17.06.2011