冗余通用约束?

InB*_*een 10 c# generics type-constraints

请考虑以下通用方法:

public T2 Frob<T1, T2>(T1 item)
        where T1 : class, T2
        => item as T2;
Run Code Online (Sandbox Code Playgroud)

编译器将拒绝编译此代码; 类型参数'T2'不能与'as'运算符一起使用,因为它没有类类型约束,也没有'class'约束

好的,这很容易解决,只需:

public T2 Frob<T1, T2>(T1 item)
        where T1 : class, T2
        where T2 : class
        => item as T2;
Run Code Online (Sandbox Code Playgroud)

但这不是多余的吗?有没有可能T2class考虑已经存在的限制T1

我的问题不是为什么这个"推理"没有在编译器中实现,原因可能只是"没有人想到它",那没关系.我更感兴趣的是,我知道我的推理是否正确,T2并且在所有情况下都限制class在第一个例子中,即使它没有明确强制执行.

Cod*_*ter 4

考虑到 C# 5.0 规范在 7.10.11 中的规定,我对此的解释是as

在 形式的操作中E as TE必须是表达式,并且T必须是引用类型、已知为引用类型的类型参数或可为 null 的类型。

此时编译器仅T2在该块中考虑:

public T2 Frob<T1, T2>(T1 item)
        where T1 : class, T2
        => item as T2;
Run Code Online (Sandbox Code Playgroud)

它发现T2自己不受约束。当然,它可以推断在这种情况下T1应该是引用类型继承T2,因此T2它本身也应该是引用类型,但我确信有理由不这样做。

  • 实际上,除了 Eric Lippert 在此答案中指出的内容之外,可能*没有*这样做的理由:http://stackoverflow.com/a/1843557。TL;DR:“功能需要时间来实现。” (3认同)