仿制药的协方差/转换问题



考虑代码:

using System.Collections.Generic;
namespace TestingTypes
{
    class Program
    {
        static void Main(string[] args)
        {
            var strings = new List<string>();               
            INeedToPassThisMethodAListOfObjects(strings as List<object>);
        }
        static void INeedToPassThisMethodAListOfObjects(List<object> objects) { }
    }
}
1>------ Build started: Project: TestingTypes, Configuration: Debug Any CPU ------
1>c:users[censored]TestingTypesProgram.cs(9,41,9,64): error CS0039: Cannot convert 
type 'System.Collections.Generic.List<string>' to 
'System.Collections.Generic.List<object>' via a reference conversion, boxing 
conversion, unboxing conversion, wrapping conversion, or null type conversion

您可能会说列表&lt; string> list&lt; object>,因为字符串是对象,并且C#4应该支持通用类型中的协方差。

  • 为什么编译器说它不能转换类型?
  • 如何将"字符串"传递给方法?

接口可以是变体;课不能。请参阅此处以获取解释。

如果您通过strings集合未销售并将声明为

,您的代码将有效
static void INeedToPassThisMethodAListOfObjects(IEnumerable<object> objects) { }

但是,这取决于您是否在此功能中需要List

您正在遇到错误,因为List<string>不是List<object>

您可以在List<object>上调用list.Add(new TextBox())

c#generics仅在通用类型不变时允许协方差(这是我从列表到iEnumerable作品的演员)。

如果您需要将列表传递给方法,则可以尝试通过

listOfStrings.Cast<object>();

缺点,如果使用该解决方案,则在方法调用中对列表中进行的任何修改都不会反映在原始列表中(因为对Cast的调用会创建新列表)。

如果您控制了方法INeedToPassThisMethodAListOfObjects,并且该方法只需要在集合上进行迭代而不是修改它,则可以将参数类型更改为IEnumerable<object>,在这种情况下,您只能通过List<string>传递CC_11问题。

您必须将字符串转换为对象。有一种很好的Linq方法。

var strings = new List<string>();               
INeedToPassThisMethodAListOfObjects(strings.Cast<object>());

编辑

根据您自己的链接,

在C#中,在以下情况下支持方差:

  • 阵列中的协方差(自C#1.0)

  • 委托中的协方差和违反率,也称为"方法组方差"(自C#2.0以来)

  • 界面和委托中通用类型参数的差异(自C#4.0以来)

所以iEnumerable会接受列表

最新更新