gpt4 book ai didi

c# - 无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换来转换类型

转载 作者:行者123 更新时间:2023-12-04 01:56:26 24 4
gpt4 key购买 nike

在C#中,如果我有一个参数类型为接口(interface)的函数的参数,如何传入实现该接口(interface)的对象。

这是一个例子:

函数的参数如下:

List<ICustomRequired>

我已经拥有的 list 如下:
List<CustomObject> exampleList
CustomObject继承自 ICustomRequired界面

传递 exampleList 的正确语法是什么?作为参数?

这就是我认为完成上述任务的方式:
exampleList as List<ICustomRequired>

但是我收到以下错误:

Cannot convert type via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion



谢谢

最佳答案

您不能转换 List一种类型为 List不同类型的。

如果你仔细想想,你会很高兴你做不到。想象一下,如果可能的话,你可能造成的破坏:

 interface ICustomRequired
{
}

class ImplementationOne : ICustomRequired
{
}

class ImplementationTwo: ICustomRequired
{
}

var listOne = new List<ImplementationOne>();
var castReference = listOne as List<ICustomRequired>();
// Because you did a cast, the two instances would point
// to the same in-memory object

// Now I can do this....
castReference.Add(new ImplementationTwo());

// listOne was constructed as a list of ImplementationOne objects,
// but I just managed to insert an object of a different type

但是请注意,这行代码是合法的:
 exampleList as IEnumerable<ICustomRequired>;

这将是安全的,因为 IEnumerable不为您提供任何添加新对象的方法。
IEnumerable<T>实际定义为 IEnumerable<out t> ,表示类型参数为 Covariant .

能不能把函数的参数改成 IEnumerable<ICustomRequired> ?

否则,您唯一的选择将是创建一个新列表。
var newList = (exampleList as IEnumerable<ICustomRequired>).ToList();

或者
var newList = exampleList.Cast<ICustomRequired>().ToList();

关于c# - 无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换来转换类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30888325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com