public static TypeContainsTyVars ( |
||
type | ||
typeVars | ||
return | bool |
private bool bindImplicitConversionFromArray() { // 13.1.4 // // The implicit reference conversions are: // // * From an array-type S with an element type SE to an array-type T with an element // type TE, provided all of the following are true: // * S and T differ only in element type. In other words, S and T have the same number of dimensions. // * An implicit reference conversion exists from SE to TE. // * From a one-dimensional array-type S[] to System.Collections.Generic.IList<S>, // System.Collections.Generic.IReadOnlyList<S> and their base interfaces // * From a one-dimensional array-type S[] to System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T> // and their base interfaces, provided there is an implicit reference conversion from S to T. // * From any array-type to System.Array. // * From any array-type to any interface implemented by System.Array. if (!GetSymbolLoader().HasBaseConversion(typeSrc, typeDest)) { return(false); } EXPRFLAG grfex = 0; // The above if checks for dest==Array, object or an interface the array implements, // including IList<T>, ICollection<T>, IEnumerable<T>, IReadOnlyList<T>, IReadOnlyCollection<T> // and the non-generic versions. // REVIEW : Determine when we need EXF_REFCHECK! if ((typeDest.IsArrayType() || (typeDest.isInterfaceType() && typeDest.AsAggregateType().GetTypeArgsAll().Size == 1 && ((typeDest.AsAggregateType().GetTypeArgsAll().Item(0) != typeSrc.AsArrayType().GetElementType()) || 0 != (flags & CONVERTTYPE.FORCECAST)))) && (0 != (flags & CONVERTTYPE.FORCECAST) || TypeManager.TypeContainsTyVars(typeSrc, null) || TypeManager.TypeContainsTyVars(typeDest, null))) { grfex = EXPRFLAG.EXF_REFCHECK; } if (needsExprDest) { binder.bindSimpleCast(exprSrc, exprTypeDest, out exprDest, grfex); } return(true); }
private bool bindImplicitConversionFromArray() { // 13.1.4 // // The implicit reference conversions are: // // * From an array-type S with an element type SE to an array-type T with an element // type TE, provided all of the following are true: // * S and T differ only in element type. In other words, S and T have the same number of dimensions. // * An implicit reference conversion exists from SE to TE. // * From a one-dimensional array-type S[] to System.Collections.Generic.IList<S>, // System.Collections.Generic.IReadOnlyList<S> and their base interfaces // * From a one-dimensional array-type S[] to System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T> // and their base interfaces, provided there is an implicit reference conversion from S to T. // * From any array-type to System.Array. // * From any array-type to any interface implemented by System.Array. if (!SymbolLoader.HasBaseConversion(_typeSrc, _typeDest)) { return false; } EXPRFLAG grfex = 0; // The above if checks for dest==Array, object or an interface the array implements, // including IList<T>, ICollection<T>, IEnumerable<T>, IReadOnlyList<T>, IReadOnlyCollection<T> // and the non-generic versions. if ((_typeDest is ArrayType || (_typeDest is AggregateType aggDest && aggDest.IsInterfaceType && aggDest.TypeArgsAll.Count == 1 && (aggDest.TypeArgsAll[0] != ((ArrayType)_typeSrc).ElementType || 0 != (_flags & CONVERTTYPE.FORCECAST)))) && (0 != (_flags & CONVERTTYPE.FORCECAST) || TypeManager.TypeContainsTyVars(_typeSrc, null) || TypeManager.TypeContainsTyVars(_typeDest, null))) { grfex = EXPRFLAG.EXF_REFCHECK; } if (_needsExprDest) { _binder.bindSimpleCast(_exprSrc, _typeDest, out _exprDest, grfex); } return true; }