Can someone explain how the compiler proceeds here to find the "common" type (double).
I assume the IConvertible plays a role here?

private static void Main(string[] args)
{
    var nrColl = new[] { 1, 2, 0.14, 'a',};
}

推荐答案

请参阅说明书中的Finding the best common type of a set of expressions.

  • 引入了一种新的非固定型变量X.
  • 对于每个表达式Ei,从它到X执行输出类型推断.
  • 如果可能,X是固定的,并且结果类型是最好的公共类型.
  • 否则,推理就会失败.

直观地说,这个推断等同于调用一个方法VOID M(X x₁...X xᵥ),以Eᵢ为自变量,推断X.

如果您遵循如何完成输出类型推断的步骤,您最终会看到,在本例中,类型变量X将具有下限intdoublechar.

然后,到fixX

对于Xᵢ的每个下界U,从候选集合中移除不存在从U到U的隐式转换的所有类型Uₑ.

如果在剩余的候选类型Uₑ中存在从所有其他候选类型隐式转换到的唯一类型V,则Xᵢ固定为V.

我们可以try 手动操作.

让我们先来看看int个.int可以隐式转换为double,因此double不会被删除.无法将int转换为char,因此删除了char.接下来我们来看一下double.double不能隐式转换为int,因此将删除int.我们现在只剩下double,所以X固定为double.

基本上,如果数组初始化器中的表达式类型中恰好有一个类型T,所有其他表达式都可以隐式转换为该类型,则T是数组的类型.

Csharp相关问答推荐

Automapper 12.x将GUID映射到字符串

C#自定义验证属性未触发IsValid方法

在使用StringBuilder时,如何根据 colored颜色 设置为richTextBox中的特定行着色?

C#动态设置ServerReport报表参数

为什么我的伺服电机不动,下面的代码?

JSON串行化程序问题.SQLite中的空值

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

如何设置WinForms按钮焦点,使其看起来像是被Tab键插入其中?

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

使用DI实例化带有动态参数的服务?

try 访问字典中的模拟对象时引发KeyNotFoundException

.NET文档对继承的困惑

为什么C#中的类型别名不能在另一个别名中使用?

为什么我的UserControl没有加载到我的主窗口中?

如何处理ASP.NET Core中包含两个构造函数的控制器?

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>

接口中的泛型基类和非泛型子类存在问题

为什么会出错';日历请求生成器';不包含';请求'";graphClient.Me.Calendars.Request().GetAsync();

调试时无法重现DbUpdateConcurrentException

HttpClient 超时时处理 TaskCanceledException