相关疑难解决方法(0)

当作为具有接口约束的通用参数传递时,值类型是否装箱?

(作为回答这个问题的研究结果,我(我想我已经!)确定答案是"不".但是,我不得不在几个不同的地方看看这个,所以我觉得还有这个问题很有价值.但如果社区投票结束,我不会感到沮丧.)

例如:

void f<T>(T val) where T : IComparable
{
   val.CompareTo(null);
}

void g()
{
   f(4);
}
Run Code Online (Sandbox Code Playgroud)

是4盒装?我知道明确地将值类型转换为它实现触发装箱的接口:

((IComparable)4).CompareTo(null); // The Int32 "4" is boxed
Run Code Online (Sandbox Code Playgroud)

我不知道的是,将值类型作为具有接口约束的泛型参数传递是否等于执行转换 - 语言"其中T是IC Comparable" 类似于建议转换,但只是转变T为IComparable似乎它会打败通用的全部目的!

为了澄清,我想确保在上面的代码中没有发生这些事情:

  1. 当g调用时f(4),由于对参数类型有约束,因此4被强制转换IComparable为.IComparablef
  2. 假定(1)不发生,内f,val.CompareTo(null)不投val从Int32到IComparable为了调用CompareTo.

但我想了解一般情况; 不只是ints和IComparables 会发生什么.

现在,如果我将以下代码放入LinqPad:

void Main()
{
    ((IComparable)4).CompareTo(null);
    f(4);
}

void f<T>(T val) where T …
Run Code Online (Sandbox Code Playgroud)

c# generics clr boxing type-constraints

6
推荐指数
1
解决办法
1411
查看次数

标签 统计

boxing ×1

c# ×1

clr ×1

generics ×1

type-constraints ×1