【问题标题】:Generic inheritance constraint on class parameter fails类参数的通用继承约束失败
【发布时间】:2018-07-17 08:12:30
【问题描述】:
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”

为什么会这样?

【问题讨论】:

  • 您不能让 方法type 的泛型参数施加约束。如果要约束T,则必须在类型级别施加该约束。
  • where T : NewT 应该在类定义中,而不是在方法定义中。
  • 我想约束 NewT 必须是 T 的父级,但我看到这是不可能的

标签: c# .net generics inheritance


【解决方案1】:

这是因为您只能约束方法中定义的类型参数。 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);
}

【讨论】:

  • 我得出的结论是,c# 语法不允许您创建以下约束:“类型必须是 SOMETHING 的父级”。只有孩子有限制
  • 您可以有点使用接口和委托(称为逆变)而不是类。解决方法对您有用吗?如果是这样,请考虑通过单击该复选标记来接受此答案。 @AndrewVinichenko
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多