当使用泛型在集合中使用对象时,.Net 会进行类型转换吗?

问题描述 投票:0回答:8

.net CLR 是否将对象类型转换为集合声明中提到的对象? 如果我声明一个

List<string> lststrs= new List<string>();
lststrs.add("ssdfsf");

.net 在添加和检索时是否会对该对象进行类型转换??????

我认为这个问题本身并没有被大家清楚地理解。让我详细说明一下。在java中存在泛型,但是如果你反编译代码,你会注意到,编译器在使用Collection对象的任何地方都放置了类型转换。例如:列表 listOfStrings; listOfStrings.add("");字符串值 = listOfStrings.get(1);反编译类文件后我们看到这个List listOfStrings; listOfStrings.add("");字符串值 = (String)listOfStrings.get(1);这里编译器已经对字符串进行了类型转换。

现在我的问题是.Net 中是否相同??

c# generics boxing
8个回答
5
投票

不,您的列表在这里被强类型化为字符串。这就是使用泛型的全部优点。


3
投票

它不会输入 no。

泛型通过只允许将指定类型的对象添加到泛型集合中来强制类型安全。这些是编译器警告。

在您的示例中,如果您尝试添加另一个对象,例如整数,那么您将收到编译器警告。


2
投票

你是这个意思吗?

List<string> myList = new List<string>();

List 是一个泛型类型 - 如果你像下面这样声明,你会得到一个编译错误:

List myList = new List(); //<-- big mama of a compilation error

无论如何 - 因为它是一个通用列表,所以它是强类型的,所以你将无法传递任何不是字符串的东西(如果你这样做,它会再次导致编译错误的big mama) ).


2
投票

没有“列表”这样的东西:)

但是,有一个

List<string>
。这里它不会转换你的字符串,因为它是字符串的集合。

但请考虑一下:

List<object> objects = new List<object>();
objects.Add("Hello SO.com");
string myString = objects.First(); //Wont compile, as objects return an object.
//You need to cast it to a string (for example, by using the as operator).

1
投票

不。不需要,因为集合是类型化的。


1
投票

根本不需要类型转换。使用泛型的事实使您的列表自动强类型化。


1
投票

不,没有。与 Java 不同,CLR 将泛型本身实现为不同的类型,而不是通过类型擦除。因此,

List<string>
List<int>
是不同的类型,并且这两种类型都是在需要时在运行时动态构造的。


1
投票

不。

查看List.Add的实现:

private T[] _items;

public void Add(T item)
{
    if (this._size == this._items.Length)
    {
        this.EnsureCapacity(this._size + 1);
    }
    this._items[this._size++] = item;
    this._version++;
}
© www.soinside.com 2019 - 2024. All rights reserved.