本文整理汇总了C#中TypeSymbol.IsTypeParameter方法的典型用法代码示例。如果您正苦于以下问题:C# TypeSymbol.IsTypeParameter方法的具体用法?C# TypeSymbol.IsTypeParameter怎么用?C# TypeSymbol.IsTypeParameter使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TypeSymbol
的用法示例。
在下文中一共展示了TypeSymbol.IsTypeParameter方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: AddTypesParticipatingInUserDefinedConversion
public static void AddTypesParticipatingInUserDefinedConversion(ArrayBuilder<NamedTypeSymbol> result, TypeSymbol type, bool includeBaseTypes, ref HashSet<DiagnosticInfo> useSiteDiagnostics)
{
if ((object)type == null)
{
return;
}
// CONSIDER: These sets are usually small; if they are large then this is an O(n^2)
// CONSIDER: algorithm. We could use a hash table instead to build up the set.
Debug.Assert(!type.IsTypeParameter());
// optimization:
bool excludeExisting = result.Count > 0;
// The decimal type does not contribute its user-defined conversions to the mix; though its
// conversions are actually implemented via user-defined operators, we logically treat it as
// though those conversions were built-in.
if (type.IsClassType() || type.IsStructType() && type.SpecialType != SpecialType.System_Decimal)
{
var namedType = (NamedTypeSymbol)type;
if (!excludeExisting || !HasIdentityConversionToAny(namedType, result))
{
result.Add(namedType);
}
}
if (!includeBaseTypes)
{
return;
}
NamedTypeSymbol t = type.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics);
while ((object)t != null)
{
if (!excludeExisting || !HasIdentityConversionToAny(t, result))
{
result.Add(t);
}
t = t.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics);
}
}
示例2: GetUnderlyingEffectiveType
private static TypeSymbol GetUnderlyingEffectiveType(TypeSymbol type, ref HashSet<DiagnosticInfo> useSiteDiagnostics)
{
// Spec 6.4.4: User-defined implicit conversions
// Spec 6.4.5: User-defined explicit conversions
//
// Determine the types S0 and T0.
// * If S or T are nullable types, let Su and Tu be their underlying types, otherwise let Su and Tu be S and T, respectively.
// * If Su or Tu are type parameters, S0 and T0 are their effective base types, otherwise S0 and T0 are equal to Su and Tu, respectively.
if ((object)type != null)
{
type = type.StrippedType();
if (type.IsTypeParameter())
{
type = ((TypeParameterSymbol)type).EffectiveBaseClass(ref useSiteDiagnostics);
}
}
return type;
}
示例3: AddTypesParticipatingInUserDefinedConversion
public static void AddTypesParticipatingInUserDefinedConversion(ArrayBuilder<NamedTypeSymbol> result, TypeSymbol type, bool includeBaseTypes, ref HashSet<DiagnosticInfo> useSiteDiagnostics)
{
if ((object)type == null)
{
return;
}
// CONSIDER: These sets are usually small; if they are large then this is an O(n^2)
// CONSIDER: algorithm. We could use a hash table instead to build up the set.
Debug.Assert(!type.IsTypeParameter());
// optimization:
bool excludeExisting = result.Count > 0;
if (type.IsClassType() || type.IsStructType())
{
var namedType = (NamedTypeSymbol)type;
if (!excludeExisting || !HasIdentityConversionToAny(namedType, result))
{
result.Add(namedType);
}
}
if (!includeBaseTypes)
{
return;
}
NamedTypeSymbol t = type.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics);
while ((object)t != null)
{
if (!excludeExisting || !HasIdentityConversionToAny(t, result))
{
result.Add(t);
}
t = t.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics);
}
}
示例4: EmitDefaultValue
private void EmitDefaultValue(TypeSymbol type, bool used, SyntaxNode syntaxNode)
{
if (used)
{
// default type parameter values must be emitted as 'initobj' regardless of constraints
if (!type.IsTypeParameter())
{
var constantValue = type.GetDefaultValue();
if (constantValue != null)
{
_builder.EmitConstantValue(constantValue);
return;
}
}
EmitInitObj(type, true, syntaxNode);
}
}
示例5: GetUserDefinedOperators
private bool GetUserDefinedOperators(
BinaryOperatorKind kind,
TypeSymbol type0,
BoundExpression left,
BoundExpression right,
ArrayBuilder<BinaryOperatorAnalysisResult> results,
ref HashSet<DiagnosticInfo> useSiteDiagnostics)
{
// Spec 7.3.5 Candidate user-defined operators
// SPEC: Given a type T and an operation operator op(A), where op is an overloadable
// SPEC: operator and A is an argument list, the set of candidate user-defined operators
// SPEC: provided by T for operator op(A) is determined as follows:
// SPEC: Determine the type T0. If T is a nullable type, T0 is its underlying type,
// SPEC: otherwise T0 is equal to T.
// (The caller has already passed in the stripped type.)
// SPEC: For all operator op declarations in T0 and all lifted forms of such operators,
// SPEC: if at least one operator is applicable (7.5.3.1) with respect to the argument
// SPEC: list A, then the set of candidate operators consists of all such applicable
// SPEC: operators in T0. Otherwise, if T0 is object, the set of candidate operators is empty.
// SPEC: Otherwise, the set of candidate operators provided by T0 is the set of candidate
// SPEC: operators provided by the direct base class of T0, or the effective base class of
// SPEC: T0 if T0 is a type parameter.
string name = OperatorFacts.BinaryOperatorNameFromOperatorKind(kind);
var operators = ArrayBuilder<BinaryOperatorSignature>.GetInstance();
bool hadApplicableCandidates = false;
NamedTypeSymbol current = type0 as NamedTypeSymbol;
if ((object)current == null)
{
current = type0.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics);
}
if ((object)current == null && type0.IsTypeParameter())
{
current = ((TypeParameterSymbol)type0).EffectiveBaseClass(ref useSiteDiagnostics);
}
for (; (object)current != null; current = current.BaseTypeWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics))
{
operators.Clear();
GetUserDefinedBinaryOperatorsFromType(current, kind, name, operators);
results.Clear();
if (CandidateOperators(operators, left, right, results, ref useSiteDiagnostics))
{
hadApplicableCandidates = true;
break;
}
}
operators.Free();
return hadApplicableCandidates;
}
示例6: CanUnifyHelper
/// <summary>
/// Determine whether there is any substitution of type parameters that will
/// make two types identical.
/// </summary>
/// <param name="t1">LHS</param>
/// <param name="t2">RHS</param>
/// <param name="substitution">
/// Substitutions performed so far (or null for none).
/// Keys are type parameters, values are types (possibly type parameters).
/// Will be updated with new subsitutions by the callee.
/// Should be ignored when false is returned.
/// </param>
/// <returns>True if there exists a type map such that Map(LHS) == Map(RHS).</returns>
/// <remarks>
/// Derived from Dev10's BSYMMGR::UnifyTypes.
/// Two types will not unify if they have different custom modifiers.
/// </remarks>
private static bool CanUnifyHelper(TypeSymbol t1, TypeSymbol t2, ref MutableTypeMap substitution)
{
if (ReferenceEquals(t1, t2))
{
return true;
}
else if ((object)t1 == null || (object)t2 == null)
{
// Can't both be null or they would have been ReferenceEquals
return false;
}
if (substitution != null)
{
t1 = substitution.SubstituteType(t1);
t2 = substitution.SubstituteType(t2);
}
// If one of the types is a type parameter, then the substitution could make them ReferenceEquals.
if (ReferenceEquals(t1, t2))
{
return true;
}
// We can avoid a lot of redundant checks if we ensure that we only have to check
// for type parameters on the LHS
if (!t1.IsTypeParameter() && t2.IsTypeParameter())
{
TypeSymbol tmp = t1;
t1 = t2;
t2 = tmp;
}
// If t1 is not a type parameter, then neither is t2
Debug.Assert(t1.IsTypeParameter() || !t2.IsTypeParameter());
switch (t1.Kind)
{
case SymbolKind.ArrayType:
{
if (t2.TypeKind != t1.TypeKind)
{
return false;
}
ArrayTypeSymbol at1 = (ArrayTypeSymbol)t1;
ArrayTypeSymbol at2 = (ArrayTypeSymbol)t2;
if (at1.Rank != at2.Rank || !at1.CustomModifiers.SequenceEqual(at2.CustomModifiers))
{
return false;
}
return CanUnifyHelper(at1.ElementType, at2.ElementType, ref substitution);
}
case SymbolKind.PointerType:
{
if (t2.TypeKind != t1.TypeKind)
{
return false;
}
PointerTypeSymbol pt1 = (PointerTypeSymbol)t1;
PointerTypeSymbol pt2 = (PointerTypeSymbol)t2;
if (!pt1.CustomModifiers.SequenceEqual(pt2.CustomModifiers))
{
return false;
}
return CanUnifyHelper(pt1.PointedAtType, pt2.PointedAtType, ref substitution);
}
case SymbolKind.NamedType:
case SymbolKind.ErrorType:
{
if (t2.TypeKind != t1.TypeKind)
{
return false;
}
NamedTypeSymbol nt1 = (NamedTypeSymbol)t1;
NamedTypeSymbol nt2 = (NamedTypeSymbol)t2;
//.........这里部分代码省略.........
示例7: IsPossiblyByRefTypeParameter
private static bool IsPossiblyByRefTypeParameter(TypeSymbol type)
{
if (type.IsTypeParameter())
{
return true;
}
if (type.IsErrorType())
{
//var byRefReturnType = type as ByRefReturnErrorTypeSymbol;
//return ((object)byRefReturnType != null) && byRefReturnType.ReferencedType.IsTypeParameter();
throw new NotImplementedException();
}
return false;
}
示例8: IsValidObjectEquality
internal static bool IsValidObjectEquality(Conversions Conversions, TypeSymbol leftType, bool leftIsNull, TypeSymbol rightType, bool rightIsNull, ref HashSet<DiagnosticInfo> useSiteDiagnostics)
{
// SPEC: The predefined reference type equality operators require one of the following:
// SPEC: (1) Both operands are a value of a type known to be a reference-type or the literal null.
// SPEC: Furthermore, an explicit reference conversion exists from the type of either
// SPEC: operand to the type of the other operand. Or:
// SPEC: (2) One operand is a value of type T where T is a type-parameter and the other operand is
// SPEC: the literal null. Furthermore T does not have the value type constraint.
// SPEC ERROR: Notice that the spec calls out that an explicit reference conversion must exist;
// SPEC ERROR: in fact it should say that an explicit reference conversion, implicit reference
// SPEC ERROR: conversion or identity conversion must exist. The conversion from object to object
// SPEC ERROR: is not classified as a reference conversion at all; it is an identity conversion.
// Dev10 does not follow the spec exactly for type parameters. Specifically, in Dev10,
// if a type parameter argument is known to be a value type, or if a type parameter
// argument is not known to be either a value type or reference type and the other
// argument is not null, reference type equality cannot be applied. Otherwise, the
// effective base class of the type parameter is used to determine the conversion
// to the other argument type. (See ExpressionBinder::GetRefEqualSigs.)
if (((object)leftType != null) && leftType.IsTypeParameter())
{
if (leftType.IsValueType || (!leftType.IsReferenceType && !rightIsNull))
{
return false;
}
leftType = ((TypeParameterSymbol)leftType).EffectiveBaseClass(ref useSiteDiagnostics);
Debug.Assert((object)leftType != null);
}
if (((object)rightType != null) && rightType.IsTypeParameter())
{
if (rightType.IsValueType || (!rightType.IsReferenceType && !leftIsNull))
{
return false;
}
rightType = ((TypeParameterSymbol)rightType).EffectiveBaseClass(ref useSiteDiagnostics);
Debug.Assert((object)rightType != null);
}
var leftIsReferenceType = ((object)leftType != null) && leftType.IsReferenceType;
if (!leftIsReferenceType && !leftIsNull)
{
return false;
}
var rightIsReferenceType = ((object)rightType != null) && rightType.IsReferenceType;
if (!rightIsReferenceType && !rightIsNull)
{
return false;
}
// If at least one side is null then clearly a conversion exists.
if (leftIsNull || rightIsNull)
{
return true;
}
var leftConversion = Conversions.ClassifyConversion(leftType, rightType, ref useSiteDiagnostics);
if (leftConversion.IsIdentity || leftConversion.IsReference)
{
return true;
}
var rightConversion = Conversions.ClassifyConversion(rightType, leftType, ref useSiteDiagnostics);
if (rightConversion.IsIdentity || rightConversion.IsReference)
{
return true;
}
return false;
}
示例9: IsPossiblyByRefTypeParameter
private static bool IsPossiblyByRefTypeParameter(TypeSymbol type)
{
if (type.IsTypeParameter())
{
return true;
}
if (type.IsErrorType())
{
var byRefReturnType = type as ByRefReturnErrorTypeSymbol;
return ((object)byRefReturnType != null) && byRefReturnType.ReferencedType.IsTypeParameter();
}
return false;
}
示例10: GetAsOperatorConstantResult
internal static ConstantValue GetAsOperatorConstantResult(TypeSymbol operandType, TypeSymbol targetType, ConversionKind conversionKind, ConstantValue operandConstantValue)
{
// NOTE: Even though BoundIsOperator and BoundAsOperator will always have no ConstantValue
// NOTE: (they are non-constant expressions according to Section 7.19 of the specification),
// NOTE: we want to perform constant analysis of is/as expressions during binding to generate warnings (always true/false/null)
// NOTE: and during rewriting for optimized codegen.
// Native compiler port:
// // check for case we know is always false
// if (arg->isNull() || !canCast(arg, type2, NOUDC) && type1->IsValType() && type2->isClassType() && (!type1->IsTypeParameterType() || !type2->isPredefType(PT_ENUM)))
// {
// GetErrorContext()->Error(tree, WRN_AlwaysNull, type2);
// return rval;
// }
if (operandConstantValue == ConstantValue.Null ||
(conversionKind == ConversionKind.NoConversion &&
(operandType.IsValueType && targetType.IsClassType() && (!operandType.IsTypeParameter() || targetType.SpecialType != SpecialType.System_Enum))))
{
return ConstantValue.Null;
}
else
{
return null;
}
}
示例11: SubstituteCustomModifiers
internal ImmutableArray<CustomModifier> SubstituteCustomModifiers(TypeSymbol type, ImmutableArray<CustomModifier> customModifiers)
{
if (type.IsTypeParameter())
{
return new TypeWithModifiers(type, customModifiers).SubstituteType(this).CustomModifiers;
}
return SubstituteCustomModifiers(customModifiers);
}