This question already has an answer here:
Cast Generic<Derived> to Generic<Base>
(1个答案)
3天前关闭。
我有一个类
模块输出这些令牌的流。类型信息在其他地方很有用,但是现在,我只需要一种简单的方法即可整理/传递它们。
我曾期望这可以工作:
但这给了我一个
所以我尝试在插入之前进行强制转换以明确显示...
相同的问题,措辞不同:
我想念什么?
一切都是对象,因此我很难理解为什么不允许这种(扩大)转换?
!!! co / contra-variance只能在接口上工作!
(1个答案)
3天前关闭。
我有一个类
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://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只能在接口上工作!
关于c# - 如何在List <MyClass <object >>中存储多个泛型类型? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59238943/
10-11 10:53