0

.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中是否相同?

4

8 回答 8

5

不,您的列表在此处被强输入为字符串。这就是使用泛型的全部优势。

于 2009-12-16T11:37:24.193 回答
3

它没有类型转换。

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

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

于 2009-12-16T11:38:27.267 回答
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).
于 2009-12-16T11:39:05.127 回答
2

你是这个意思吗?

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

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

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

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

于 2009-12-16T11:39:58.373 回答
1

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

于 2009-12-16T11:37:53.663 回答
1

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

于 2009-12-16T11:38:09.717 回答
1

不,它没有。与 Java 不同,CLR 将泛型实现为自己的不同类型,而不是通过类型擦除。因此, aList<string>是与 不同的类型List<int>,两种类型都是在运行时在需要时动态构造的。

于 2009-12-16T11:41:53.440 回答
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++;
}
于 2009-12-16T11:46:53.450 回答