con*_*low 41 c# compiler-construction generics covariance contravariance
在C#中可以将方差注释添加到类型参数,约束为值类型:
interface IFoo<in T> where T : struct
{
void Boo(T x);
}
Run Code Online (Sandbox Code Playgroud)
如果在这种情况下方差注释完全没有意义,为什么编译器允许这样做?
Eri*_*ert 36
为什么编译器允许这样做,因为在这种情况下,方差注释完全没有意义?
这是编译器允许的,因为当我将方差规则添加到C#4.0编译器时,我甚至从未考虑过有人可能会尝试这样做.
编译器警告和错误是功能,为了实现功能,在发布编译器之前,必须至少考虑它.我没有这样做,因此从来没有机会甚至辩论是否应该对这种情况发出警告.
现在您已经引起了我的注意,问题是:它应该是一个功能吗?编译器是否应该针对此案例发出警告(或错误)?
这是一个判断电话.我们考虑的一些事情是:
代码是某种人可能会认为它做了一些合理的事情吗?人们不希望; 人们希望那些了解类型系统的开发人员能够创建一个接口变体也知道方差仅适用于引用类型.但也许有些开发人员可能会认为它会起作用.至少它似乎没有合理性.它没有明显的设计.
代码明显错了吗?是的,它可能是.似乎不太可能有人故意想要编写一个看似变体但实际上并非如此的界面.
等等.
我将不得不更多地考虑它,但乍一看看起来这实际上可能是添加到编译器的一个不错的警告.我将与团队讨论,我们会考虑将其添加到Roslyn版本中.
谢谢你的想法!
| 归档时间: |
|
| 查看次数: |
919 次 |
| 最近记录: |