相关疑难解决方法(0)

为什么协方差和逆变不支持值类型

IEnumerable<T>共变体,但它不支持值类型,仅支持引用类型.以下简单代码编译成功:

IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Run Code Online (Sandbox Code Playgroud)

但是从更改stringint将得到编译错误:

IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Run Code Online (Sandbox Code Playgroud)

原因在MSDN中解释:

差异仅适用于参考类型; 如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型是不变的.

我搜索过并发现有些问题提到的原因是值类型和引用类型之间的装箱.但它仍然不清楚我的想法为什么拳击是什么原因?

有人可以给出一个简单而详细的解释为什么协方差和逆变不支持值类型以及拳击如何影响这个?

.net c# covariance contravariance c#-4.0

144
推荐指数
3
解决办法
8497
查看次数

为什么C#不支持类/方法级别的const?

我一直想知道为什么C#不支持const类或方法级别.我知道Jon Skeet长期以来一直希望支持不变性,并且我认为使用函数const的C++语法可以帮助实现这一点.通过在类级别添加const关键字,我们将获得全面支持.

现在,我的问题是,C#团队没有开发出这种支持的原因是什么?

我想可以通过编译时检查或通过属性创建所有内容,而无需更改CLR.我不介意代码能够通过反射覆盖const行为.

想象一下:

const class NumberContainer
{
    public int Number { get; }
}
Run Code Online (Sandbox Code Playgroud)

..这样的类只能在构造时填充,所以我们需要一个构造函数来接受一个int.

另一个例子是方法级别的const:

public int AddNumbers(NumberContainer n1, NumberContainer n2) const
{
   return n1.Number + n2.Number;
}
Run Code Online (Sandbox Code Playgroud)

const级方法不应该能够改变它们自己的类中的状态或传递给它们的引用类型的实例.此外,const级函数只能在其范围内调用其他const级函数.

我不确定lambdas和代表是否会使一切都太难(或不可能)实现,但我确信有更多语言和编译器设计经验的人可以告诉我.

正如史蒂夫B在评论中指出的那样,存在readonly使得事情变得更复杂,因为const和readonly它们在期间接近相同runtime,但是readonly在编译期间无法确定值.我想我们可以拥有constreadonly水平,但这可能太混乱了?

那么,没有实现这个的原因是什么?可用性问题(理解C++中的常量通常对新用户来说很难),语言设计问题(无法完成)或仅仅是优先级问题(不变性的时代 - 嗡嗡声已经结束).

c# language-design const

25
推荐指数
1
解决办法
6119
查看次数

标签 统计

c# ×2

.net ×1

c#-4.0 ×1

const ×1

contravariance ×1

covariance ×1

language-design ×1