private void ExactInference(CType pSource, CType pDest)
{
// SPEC: An exact inference from a CType U to a CType V is made as follows:
// SPEC: If V is one of the unfixed Xi then U is added to the set of
// SPEC: exact bounds for Xi.
if (ExactTypeParameterInference(pSource, pDest))
{
return;
}
// SPEC: Otherwise, if U is an array CType UE[...] and V is an array CType VE[...]
// SPEC: of the same rank then an exact inference from UE to VE is made.
if (ExactArrayInference(pSource, pDest))
{
return;
}
// SPEC: Otherwise, if U is the CType U1? and V is the CType V1? then an
// SPEC: exact inference is made from U to V.
if (ExactNullableInference(pSource, pDest))
{
return;
}
// SPEC: Otherwise, if V is a constructed CType C<V1...Vk> and U is a constructed
// SPEC: CType C<U1...Uk> then an exact inference is made
// SPEC: from each Ui to the corresponding Vi.
if (ExactConstructedInference(pSource, pDest))
{
return;
}
// SPEC: Otherwise no inferences are made.
}