如何在List <MyClass <object >>中存储多个泛型类型?

时间:2019-12-08 19:08:41

标签: c# generics casting

我有一个TokenDefinition<T>类,其中T不受限制

public class TokenDefinition<T> { ... }

模块输出这些令牌的流。类型信息在其他地方很有用,但是现在,我只需要一种简单的方法即可整理/传递它们。

我曾希望它能起作用:

var expected = new List<TokenDefinition<object>>();
expected.Add(new TokenDefinition<string>());
expected.Add(new TokenDefinition<double>());
expected.Add(new TokenDefinition<Keyword>()); // Keyword is an enum

但这给了我Cannot convert from TokenDefinition<string> to TokenDefinition<object>

所以我尝试在插入之前进行强制转换以明确显示...

expected.Add((TokenDefinition<object>) new TokenDefinition<string>());

同一问题,措辞不同:Cannot convert type TokenDefinition<string> to TokenDefinition<object>

我想念什么?

一切是一个对象,所以我很难理解为什么不允许这种(扩展)转换?

1 个答案:

答案 0 :(得分:2)

这确实相当令人困惑,您应该阅读协方差和逆方差: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/

这将起作用:

public interface ITokenDefinition<out T>{}
public class TokenDefinition<T> : ITokenDefinition<T> {  }

void Main()
{

    var expected = new List<ITokenDefinition<object>>();
    expected.Add(new TokenDefinition<string>());
}

!!! co / contra-variance只能在接口上使用... !!!