(作为回答这个问题的研究结果,我(我想我已经!)确定答案是"不".但是,我不得不在几个不同的地方看看这个,所以我觉得还有这个问题很有价值.但如果社区投票结束,我不会感到沮丧.)
例如:
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似乎它会打败通用的全部目的!
为了澄清,我想确保在上面的代码中没有发生这些事情:
g调用时f(4),由于对参数类型有约束,因此4被强制转换IComparable为.IComparableff,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)