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

标签 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>

我错过了什么?

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

最佳答案

这确实相当令人困惑,你应该阅读协变和逆变: https://learn.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>());
}

<强>!!!协方差/逆变函数仅适用于接口(interface)......!!!

关于c# - 如何在 List<MyClass<object>> 中存储多个泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59238943/

相关文章:

generics - 具有任何参数列表的函数的通用仿函数

Java 通配符读写权限

c++ - 如何在不诉诸 const_cast 的情况下打开 HINSTANCE?

c# - 当我尝试展开模型属性时,为什么 Visual Studio 2013 调试器关闭时没有错误?

c# - 是否可以从 MethodBuilder/ConstructorBuilder 调用 DynamicMethod

c# - 未分配的属性会占用类中的内存吗?

c# - 模拟 IRavenQueryable 并附加 Where() 表达式

java - 使用通用 Map 参数重写方法

c - 这应该是 int,那我们为什么要使用 %s?

c++ - 为什么可能丢失数据的赋值不产生编译器警告