从T到具有通用约束对象与对象的对象的差异

时间:2014-01-14 17:35:27

标签: c# generics

当我有约束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;
}

1 个答案:

答案 0 :(得分:1)

没有: object这样的通用约束。第一个例子有两个错误:

  

错误1约束不能是特殊类'对象'

然后:

  

错误2无法将类型'System.Converter'隐式转换为'System.Converter'

所以简单地说,由于没有有效约束,因此无法对System.Converter<string,T>进行非约束Converter<string, object>的投射。

第二个例子有一个有效的约束。 T是引用类型,可以转换为object,因为它是类型层次结构的根。