C# 隐式转换IEnumerable到泛型类型

C# 隐式转换IEnumerable到泛型类型,c#,generics,covariance,C#,Generics,Covariance,我在使用隐式强制转换和IEnumerable时遇到了一个有趣的例子——请看最后一行附加代码——它不会编译 公共类外部 { 私人T场; 公共外部(it) { 字段=它; } 公共静态隐式运算符外部(T源) { 返回新的外部(源); } } void Main() { 外部intsample=“aa”; 外部列表样本=新列表(); //以下行失败,原因如下: //CS0266无法隐式转换类型“System.Collections.Generic.IEnumerable” //到“UserQuery.

我在使用隐式强制转换和IEnumerable时遇到了一个有趣的例子——请看最后一行附加代码——它不会编译

公共类外部
{
私人T场;
公共外部(it)
{
字段=它;
}
公共静态隐式运算符外部(T源)
{
返回新的外部(源);
}
}
void Main()
{
外部intsample=“aa”;
外部列表样本=新列表();
//以下行失败,原因如下:
//CS0266无法隐式转换类型“System.Collections.Generic.IEnumerable”
//到“UserQuery.Outer”。
//存在显式转换(是否缺少强制转换?)
外部enumerablesample=Enumerable.Empty();
}
我有一种非常强烈的直觉,它对协变的IEnumerable感到高兴,但有人能更正式地解释一下吗?

状态:

允许类或结构声明来自源的转换 如果满足以下所有条件,则将类型S转换为目标类型T:

  • S和T是不同的类型
  • S或T是进行运算符声明的类或结构类型
  • S或T都不是对象或接口类型。T不是S的基类,S也不是T的基类
简单的解决方法是更改:

Enumerable.Empty<object>();
Enumerable.Empty();
致:

newlist();

因为
List
不是一个接口(谢谢@PatrickHofman!),所以它可以工作。

为什么不显式强制转换呢?因为这是唯一一个显示问题的示例,如果您使用像LanguageText及其任一类型的库,隐式强制转换非常方便。不幸的是,我无法理解将其标记为重复,并指出与差异和继承性无关的答案。同意@Mafii可能与接口无关:调用
Enumerable.Empty().ToList()
works很有趣你只是在重复这里可以找到的副本:它工作起来并不奇怪:
List
不是一个接口,它是一个具体的类型。很好的调用-谢谢@partrickhoffman!
new List<object>();