Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 演员名单<;T>;列出<;界面>;_C#_.net_Interface_Casting - Fatal编程技术网

C# 演员名单<;T>;列出<;界面>;

C# 演员名单<;T>;列出<;界面>;,c#,.net,interface,casting,C#,.net,Interface,Casting,如何将List转换为List?只能通过创建新的List并传输所有元素来实现。只能通过创建新的List并传输所有元素来实现。转换迭代器和.ToList(): List casted=input.Cast().ToList()就可以了 起初我说协方差会起作用——但正如乔恩正确地指出的那样;不,不会的 最初,我还愚蠢地取消了ToList()调用强制转换迭代器和.ToList(): List casted=input.Cast().ToList()就可以了 起初我说协方差会起作用——但正如乔恩正确地指出

如何将
List
转换为
List

只能通过创建新的
List
并传输所有元素来实现。

只能通过创建新的
List
并传输所有元素来实现。

转换迭代器和.ToList():

List casted=input.Cast().ToList()
就可以了

起初我说协方差会起作用——但正如乔恩正确地指出的那样;不,不会的


最初,我还愚蠢地取消了
ToList()
调用强制转换迭代器和.ToList():

List casted=input.Cast().ToList()
就可以了

起初我说协方差会起作用——但正如乔恩正确地指出的那样;不,不会的


最初我还愚蠢地取消了
ToList()
调用

如果可以使用LINQ,那么就可以这样做

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}
List clientList=newlist();
List=clientList.Select(c=>(IDic)c.ToList();

如果您可以使用LINQ,那么您可以这样做

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}
List clientList=newlist();
List=clientList.Select(c=>(IDic)c.ToList();
您不能强制转换它(保留引用标识)-这将是不安全的。例如:

List<Client> clientList = new List<Client>();
List<IDic> list = clientList.Select(c => (IDic)c).ToList();
public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];
公共接口IFruit{}
公共类苹果:IFruit{}
公共类香蕉:IFruit{}
...
列出苹果=新列表();
列出水果=苹果;//幸运的是,这是不允许的
水果。添加(新香蕉());
//这是一根香蕉!
苹果=苹果[0];
现在,由于协方差的原因,您可以在.NET 4/C#4中将
列表
转换为
IEnumerable
,但如果您想要
列表
,则必须创建一个新列表。例如:

List<Client> clientList = new List<Client>();
List<IDic> list = clientList.Select(c => (IDic)c).ToList();
public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];
//在.NET 4中,使用IEnumerable的协方差
列出水果=苹果。ToList();
//在.NET3.5中
列出水果=苹果.Cast().ToList();
但这与铸造原始列表不同,因为现在有两个单独的列表。这是安全的,但您需要了解,对一个列表所做的更改不会显示在另一个列表中。(当然,列表引用的对象的修改将被看到。)

您不能强制转换它(保留引用标识)-这将是不安全的。例如:

List<Client> clientList = new List<Client>();
List<IDic> list = clientList.Select(c => (IDic)c).ToList();
public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];
公共接口IFruit{}
公共类苹果:IFruit{}
公共类香蕉:IFruit{}
...
列出苹果=新列表();
列出水果=苹果;//幸运的是,这是不允许的
水果。添加(新香蕉());
//这是一根香蕉!
苹果=苹果[0];
现在,由于协方差的原因,您可以在.NET 4/C#4中将
列表
转换为
IEnumerable
,但如果您想要
列表
,则必须创建一个新列表。例如:

List<Client> clientList = new List<Client>();
List<IDic> list = clientList.Select(c => (IDic)c).ToList();
public interface IFruit {}

public class Apple : IFruit {}
public class Banana : IFruit {}

...

List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());

// Eek - it's a banana!
Apple apple = apples[0];
//在.NET 4中,使用IEnumerable的协方差
列出水果=苹果。ToList();
//在.NET3.5中
列出水果=苹果.Cast().ToList();
但这与铸造原始列表不同,因为现在有两个单独的列表。这是安全的,但您需要了解,对一个列表所做的更改不会显示在另一个列表中。(当然,将看到对列表所指对象的修改。)

List listOfA=new List();
List List=listOfA.Cast().ToList();
List listOfA=新列表();
List List=listOfA.Cast().ToList();

我也有这个问题,在阅读了Jon Skeet的答案后,我将代码从使用
列表修改为使用
IEnumerable
。虽然这并没有回答OP的原始问题,即如何将
List
转换为
List
,但它确实避免了这样做的必要性,因此可能对遇到此问题的其他人有所帮助。当然,这假设需要使用
List
的代码在您的控制之下

例如:

public void ProcessIDic(IEnumerable序列)
{
//实施
}
而不是:

public void ProcessIDic(IEnumerable<IDic> sequence)
{
   // Implementation
}
public void ProcessIDic(列表)
{
//实施
}

我也有这个问题,在阅读了Jon Skeet的答案后,我将代码从使用
列表修改为使用
IEnumerable
。虽然这并没有回答OP的原始问题,即如何将
List
转换为
List
,但它确实避免了这样做的必要性,因此可能对遇到此问题的其他人有所帮助。当然,这假设需要使用
List
的代码在您的控制之下

例如:

public void ProcessIDic(IEnumerable序列)
{
//实施
}
而不是:

public void ProcessIDic(IEnumerable<IDic> sequence)
{
   // Implementation
}
public void ProcessIDic(列表)
{
//实施
}

在.Net 3.5中,您可以执行以下操作:

public void ProcessIDic(List<IDic> list)
{
   // Implementation
}
List interfaceList=新列表(List.Cast());
在本例中,List的构造函数采用IEnumerable

列表但只能转换为IEnumerable。尽管myObj可以转换为IEnumerable,但在.Net 3.5中,IEnumerable类型不能转换为IEnumerable。

,您可以执行以下操作:

public void ProcessIDic(List<IDic> list)
{
   // Implementation
}
List interfaceList=新列表(List.Cast());
在本例中,List的构造函数采用IEnumerable
列表但只能转换为IEnumerable。尽管myObj可以转换为IEnumerable,但类型IEnumerable不能转换为IEnumerable。

您可以尝试以下方法:

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
使用(var dbContext=YourDatabaseContext())
{
var list=dbContext.Clients.Where(x=>x.Happy)
第()类
.ToList();
}
请参见

您可以尝试以下方法:

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
使用(var dbContext=YourDatabaseContext())
{
var list=dbContext.Clients.Where(x=>x.Happy)
第()类
.ToList();
}

请参见

Cast
返回一个
IEnumerable
,而不是一个
列表
——不,协方差不允许进行此转换,因为它将是uns