gpt4 book ai didi

C# 裸类型约束

转载 作者:行者123 更新时间:2023-11-30 13:29:54 26 4
gpt4 key购买 nike

在“C# 6.0 in a Nutshell”中有一个裸类型约束用法的例子:

class Stack<T>
{
Stack<U> FilteredStack<U>() where U : T {...}
}

老实说,我不明白为什么要在这里使用这个约束条件。如果我将其删除并将 U 更改为 T,结果将相同。那有什么意义呢?

谢谢。

最佳答案

重点是U可以是 T 的子类的任何类型, 和 Stack你得到的是一堆 that 类型,而不是 T .因此,添加到其中的项目必须是 U 类型, 你从中取回的元素保证是 U如果它们不为空。编译时类型检查的所有熟悉的喜怒哀乐。

Stack<T> 中的项目可以是 T 类型,或 T 的任何子类.该方法的名称表明它正在返回一个堆栈,该堆栈仅包含父堆栈中实际上属于某个特定子类的项目。一旦您保证新堆栈中的所有项目都属于更专门化的类型,那么如果新堆栈的类型也是这种类型,则更有用。

这是一个非常人为设计的例子(很明显,这个“堆栈”类实际上并没有做堆栈所做的任何事情,但对于我们的例子来说它不需要这样做):

public class A
{
public A(String s)
{
SA = s;
}
public String SA { get; set; }
}

public class B : A
{
public B(String s, string s1)
{
SA = s;
SB = s1;
}
public String SB { get; set; }
}

class Stack<T>
{
Stack<U> FilteredStack<U>() where U : T
{
return new Stack<U>(Items.OfType<U>());
}

public IEnumerable<T> Items { get { return _items; } }

public static void Test()
{
var s1 = new Stack<A>(new[] { new A("A1"), new B("B1", "Some other value") });
var s2 = s1.FilteredStack<B>();

// s2 is a strongly typed stack of type B
Console.WriteLine(s2.Items.First().SB);
}


private List<T> _items = new List<T>();
public Stack(IEnumerable<T> items) {
_items = new List<T>(items);
}
}

关于C# 裸类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45967492/

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