将对象转换为泛型类型的方法

Hek*_*eki 7 c# generics casting

关于Casting泛型类型"as T",同时强制执行T的类型

并通过以下示例

private static T deserialize<T>(string streng) where T : class
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    StringReader reader = new StringReader(streng);
    return ser.Deserialize(reader) as T;
}
Run Code Online (Sandbox Code Playgroud)

private static T deserialize<T>(string streng)
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    StringReader reader = new StringReader(streng);
    return (T)ser.Deserialize(reader);
}
Run Code Online (Sandbox Code Playgroud)

我习惯于进行object as Type演员表演,所以当我发现我不能那样做时,我有点困惑T.然后我找到了上面的问题,并找到了as T编译器错误的解决方案.

但是为什么where T : class在使用object as T时需要而不是在使用时(T)object?两种铸造物体的方式之间的实际差异是什么?

Mar*_*ell 18

因为as暗示强制转换可能会失败并返回null.没有: class,T可能是int等 - 这是不可能的null.有了(T)obj它只会在爆炸火花的淋浴; 无需处理null.

作为旁边(重新struct),注意你可以使用,as如果它已知你正在铸造Nullable<>- 例如:

static T? Cast<T>(object obj) where T : struct
{
    return obj as T?;
}
Run Code Online (Sandbox Code Playgroud)