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)
但这不是多余的吗?有没有可能T2不class考虑已经存在的限制T1?
我的问题不是为什么这个"推理"没有在编译器中实现,原因可能只是"没有人想到它",那没关系.我更感兴趣的是,我知道我的推理是否正确,T2并且在所有情况下都限制class在第一个例子中,即使它没有明确强制执行.
考虑到 C# 5.0 规范在 7.10.11 中的规定,我对此的解释是as:
在 形式的操作中
E as T,E必须是表达式,并且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它本身也应该是引用类型,但我确信有理由不这样做。
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |