一个types参数的C#方差注解,约束为值types
在C#中可以将types注释添加到types参数中,限制为值types:
interface IFoo<in T> where T : struct { void Boo(T x); }
为什么编译器允许这样做,如果方差标注在这种情况下完全没有意义?
为什么这是编译器允许的,因为方差注释在这种情况下完全没有意义?
这是编译器所允许的,因为我从来没有考虑到有人可能会尝试这样做,当我将方差规则添加到C#4.0编译器。
编译器的警告和错误是特性 ,为了实现一个特性,必须在发布编译器之前的某个时候考虑一下 。 我没有这样做,所以从来没有机会辩论是否应该警惕这种情况。
现在你已经提请我注意了,问题是:它应该是一个function吗? 编译器是否应该为这种情况发出警告(或错误)?
这是一个判断呼吁。 我们会考虑的一些事情是:
-
代码是某种人可能会认为是否合理的东西? 一个人不希望; 人们希望那些对types系统足够了解的接口变体的开发人员也知道variables只能用于引用types。 但也许有开发人员可能会认为它会起作用。 至less似乎没有超出合理的范围。 这不是很清楚。
-
代码显然是错的吗? 是的,这可能是。 看起来不太可能有人故意要编写一个看起来不一样的界面,但事实上并非如此。
等等。
我不得不多加考虑,但乍看起来,这实际上可能是一个不错的警告,可以添加到编译器中。 我会和团队交谈,我们会考虑将其添加到Roslyn版本。
感谢您的想法!
它只是因为它是合法的代码而被允许的。 它绝对没有坏处。 是的,你不能使用逆变换,但我没有看到问题。 代码中的任何内容实际上都不会误导或隐藏一些扭曲的疑难杂症 。
我只是觉得在检查方差有效性时,编译器不会检查T
是一个值types还是一个引用types 。 C#团队认为,使用generics接口方差的人会知道,在值types中这样做毫无意义,并且在任何情况下都没有次要的影响。