【发布时间】:2015-10-17 09:12:15
【问题描述】:
我首先在更复杂的上下文中尝试了泛型类转换,结果发现这是不可能的。因此,仅出于演示目的,我编写了这个示例,它是关于我能想到的问题的最一般表述,省略了任何不必要的内容:
using System;
using System.Collections.Generic;
namespace testapp
{
class Program
{
static void Main(string[] args)
{
// problem
Generic<Sub> subvar = new Generic<Sub>();
Generic<Super> supervar;
supervar = (Generic<Super>)subvar; // <--fails
// reason for asking
List<Generic<Super>> list = new List<Generic<Super>>();
list.Add(supervar);
}
}
class Super { }
class Sub:Super { }
class Generic<T> where T : Super { }
}
所以总的来说:因为每个“Sub”都是“Super”,我认为每个“Generic of Sub”都是“Generic of Super”。所以我希望将Generic<Sub> 的引用分配给Generic<Super> 的变量不会有问题,即使没有显式类型转换。
但是 .NET Framework 告诉我这种转换是被禁止的,为什么?
那么,我为什么要这样做?假设我想构建一个只接受“anything 的泛型”的集合,我将如何绕过转换?
【问题讨论】:
-
仅仅因为
Sub是Super的子类型不 暗示Generic<Sub>是Generic<Super>的子类型。
标签: c# generics collections type-conversion