Почему ниже не компилируется? Что особенного в интерфейсе, который заставляет компилятор думать, что он не может отличить от Container<T>
до T
, когда T
- это интерфейс? Я не думаю, что это ковариантная проблема, поскольку я не удручаю, но, возможно, это так. Это совсем как Why C# compiler doesn't call implicit cast operator?, но я не думаю, что это совсем то же самое.C# общий неявный листинг на интерфейсе не удалось
Product pIn =null;
Product pOut;
Container<Product> pContainer;
List<Product> pListIn = null;
List<Product> pListOut;
Container<List<Product>> pListContainer;
IList<Product> pIListIn = null;
IList<Product> pIListOut;
Container<IList<Product>> pIListContainer;
pContainer = pIn;
pOut = pContainer; // all good
pListContainer = pListIn;
pListOut = pListContainer; // all good too
pIListContainer = pIListIn; // fails , cant do implicit cast for some reason
pIListOut = pIListContainer; // and here too
class Container<T>
{
private T value;
private Container(T item) { value = item; }
public static implicit operator Container<T>(T item)
{
return new Container<T>(item);
}
public static implicit operator T(Container<T> container)
{
return container.value;
}
}
Cannot implicitly convert type 'Container<IList<Product>>' to 'IList<Product>'. An explicit conversion exists (are you missing a cast?)
Cannot implicitly convert type 'IList<Product>' to 'Container<IList<Product>>'. An explicit conversion exists (are you missing a cast?)
+1 - Интересно, на самом деле. Любопытно, чтобы увидеть ответ. – Lucero 2010-11-25 20:23:25
+1 - Просто эта ошибка компиляции и вы хотите задать вопрос! – TDaver 2011-02-21 16:21:40