作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
给定以下类型:
public interface IMyClass { }
public class MyClass : IMyClass { }
我想知道如何转换 List<MyClass>
到 List<IMyClass>
?我对协变/逆变主题不是很清楚,但我知道我不能因此而简单地使用 List。
我只能想出这个微不足道的解决方案;缺乏优雅,浪费资源:
...
public List<IMyClass> ConvertItems(List<MyClass> input)
{
var result = new List<IMyClass>(input.Count);
foreach (var item in input)
{
result.Add(item);
}
return result;
}
....
如何以更优雅/更高效的方式解决它?
(请注意,我需要 .NET 2.0 解决方案,但为了完整起见,我也很乐意看到使用更新框架版本的更优雅的解决方案。)
最佳答案
最简单的方法可能是使用 ConvertAll
:
List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);
即使您使用的是 .NET 2,如果您使用的是 VS2008 或更高版本,也可以使用 lambda 语法。否则,总是有匿名方法:
List<IMyClass> converted = original.ConvertAll<IMyClass>(
delegate (MyClass x) { return x; });
在 .NET 3.5 中,您可以将 LINQ 与 Cast
结合使用, OfType
甚至只是 Select
:
var converted = original.Cast<IMyClass>().ToList();
var converted = original.OfType<IMyClass>().ToList();
var converted = original.Select(x => (IMyClass) x).ToList();
在 .NET 4.0 中,您可以使用 ToList
由于 IEnumerable<T>
的协方差,直接没有中间转换:
var converted = original.ToList<IMyClass>();
关于c# - Casting List<T> - 协方差/逆变问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931789/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!