当我有约束Converter<string, T>
时,试图弄清楚如何从Converter<string, object>
投射到where T : object
。通过将约束更改为where T : class
解决了这个问题,但我并不完全确定为什么会这样做。
这不编译:
public void Foo<T>(Converter<string, T> x) where T : object
{
Converter<string, object> y = x;
}
Error: Cannot implicitly convert type 'System.Converter<string,T>' to 'System.Converter<string,object>'
然而以下情况确实如此?
public void Foo<T>(Converter<string, T> x) where T : class
{
Converter<string, object> y = x;
}
答案 0 :(得分:1)
没有: object
这样的通用约束。第一个例子有两个错误:
错误1约束不能是特殊类'对象'
然后:
错误2无法将类型'System.Converter'隐式转换为'System.Converter'
所以简单地说,由于没有有效约束,因此无法对System.Converter<string,T>
进行非约束Converter<string, object>
的投射。
第二个例子有一个有效的约束。 T
是引用类型,可以转换为object
,因为它是类型层次结构的根。