首页 > 解决方案 > 类参数的通用继承约束失败

问题描述

public class Test<T>
{
    private T something;
    public Test<NewT> Cast<NewT>() where T : NewT
    {
        return new Test<NewT>() { something = this.something };
    }
}

VS 错误:“Test.Cast()”未定义类型参数“T”

为什么会发生这种情况?

标签: c#.netgenericsinheritance

解决方案


这是因为您只能约束方法中定义的类型参数。T不是在方法中定义的,而是在类中定义的,所以你不能那样约束它。

但是,您可以创建Cast一个扩展方法:

// in some static class
public static Test<NewT> Cast<T, NewT>(this Test<T> test) where T : NewT {
    return new Test<NewT>() { something = test.something }; 
}

这意味着something必须将其公开,这有时可能是不可取的。您也可以这样做:

public class Test<T>
{
    public T Something { get; private set; }

    public Test(T something) {
        Something = something;
    }

}

// in some static class
public static Test<NewT> Cast<T, NewT>(this Test<T> test) where T : NewT
{
    return new Test<NewT>(test.Something);
}

推荐阅读