加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#裸型约束

发布时间:2020-12-15 23:49:53 所属栏目:百科 来源:网络整理
导读:在“C#6.0 in a Nut shell”中有一个裸体类型constarint用法的例子: class StackT{ StackU FilteredStackU() where U : T {...}} 老实说,我不明白为什么我应该在这里使用这个约束.如果我将其删除并将U更改为T,结果将是相同的.那有什么意义呢? 谢谢. 解决方
在“C#6.0 in a Nut shell”中有一个裸体类型constarint用法的例子:

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

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

谢谢.

解决方法

关键是U可以是T的子类的任何类型,并且您获得的Stack是该类型的堆栈,而不是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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读