考虑代码:
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会接受列表