在下面的示例中(仅用于演示目的),如果
T
未与类一起约束,则此转换:var ret = objectA as T;
如果您这样做,将会导致以下编译错误:
类型参数“T”不能与“as”运算符一起使用,因为它没有类类型约束或“class”约束。
我不明白为什么我不能这样做。既然我已经将 T
约束为接口 IObject
,编译器应该知道 T
必须是一个接口类型,而 as
操作应该是有效的。
public interface IObject
{
string Id { get; set; }
}
public class ObjectA : IObject
{
public string Id { get; set; }
}
public class ObjectFactory
{
public T CreateObject<T>(string id) where T : IObject
{
ObjectA objectA = new ObjectA();
var x = objectA as IObject; // this is good
var ret = objectA as T; // why this 'as' cannot compile?
return ret;
}
public T CreateClassObject<T>(string id) where T : class, IObject
{
ObjectA objectA = new ObjectA();
var ret = objectA as T; // if T is class, this 'as' can compile
return ret;
}
}