本文整理汇总了C#中TypeSymbol.ContainsTuple方法的典型用法代码示例。如果您正苦于以下问题:C# TypeSymbol.ContainsTuple方法的具体用法?C# TypeSymbol.ContainsTuple怎么用?C# TypeSymbol.ContainsTuple使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TypeSymbol
的用法示例。
在下文中一共展示了TypeSymbol.ContainsTuple方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CopyTypeCustomModifiers
/// <param name="sourceType">Type that already has custom modifiers.</param>
/// <param name="destinationType">Same as <paramref name="sourceType"/>, but without custom modifiers. May differ in object/dynamic.</param>
/// <param name="refKind"><see cref="RefKind"/> of the parameter of which this is the type (or <see cref="RefKind.None"/> for a return type.</param>
/// <param name="containingAssembly">The assembly containing the signature referring to the destination type.</param>
/// <returns><paramref name="destinationType"/> with custom modifiers copied from <paramref name="sourceType"/>.</returns>
internal static TypeSymbol CopyTypeCustomModifiers(TypeSymbol sourceType, TypeSymbol destinationType, RefKind refKind, AssemblySymbol containingAssembly)
{
Debug.Assert(sourceType.Equals(destinationType, ignoreCustomModifiersAndArraySizesAndLowerBounds: true, ignoreDynamic: true));
if (sourceType.ContainsTuple())
{
// TODO(https://github.com/dotnet/roslyn/issues/12389):
// Need to save/restore tupleness as well
if (sourceType.IsTupleType)
{
Debug.Assert(destinationType.IsTupleType);
return destinationType;
}
ImmutableArray<bool> flags = CSharpCompilation.DynamicTransformsEncoder.EncodeWithoutCustomModifierFlags(destinationType, refKind);
TypeSymbol resultType = DynamicTypeDecoder.TransformTypeWithoutCustomModifierFlags(sourceType, containingAssembly, refKind, flags);
Debug.Assert(resultType.Equals(sourceType, ignoreCustomModifiersAndArraySizesAndLowerBounds: false, ignoreDynamic: true)); // Same custom modifiers as source type.
return resultType;
}
else
{
// NOTE: overrides can differ by object/dynamic. If they do, we'll need to tweak newType before
// we can use it in place of this.Type. We do so by computing the dynamic transform flags that
// code gen uses and then passing them to the dynamic type decoder that metadata reading uses.
ImmutableArray<bool> flags = CSharpCompilation.DynamicTransformsEncoder.EncodeWithoutCustomModifierFlags(destinationType, refKind);
TypeSymbol resultType = DynamicTypeDecoder.TransformTypeWithoutCustomModifierFlags(sourceType, containingAssembly, refKind, flags);
Debug.Assert(resultType.Equals(sourceType, ignoreCustomModifiersAndArraySizesAndLowerBounds: false, ignoreDynamic: true)); // Same custom modifiers as source type.
Debug.Assert(resultType.Equals(destinationType, ignoreCustomModifiersAndArraySizesAndLowerBounds: true, ignoreDynamic: false)); // Same object/dynamic as destination type.
return resultType;
}
}
示例2: CopyTypeCustomModifiers
/// <param name="sourceType">Type that already has custom modifiers.</param>
/// <param name="destinationType">Same as <paramref name="sourceType"/>, but without custom modifiers. May differ in object/dynamic.</param>
/// <param name="refKind"><see cref="RefKind"/> of the parameter of which this is the type (or <see cref="RefKind.None"/> for a return type.</param>
/// <param name="containingAssembly">The assembly containing the signature referring to the destination type.</param>
/// <returns><paramref name="destinationType"/> with custom modifiers copied from <paramref name="sourceType"/>.</returns>
internal static TypeSymbol CopyTypeCustomModifiers(TypeSymbol sourceType, TypeSymbol destinationType, RefKind refKind, AssemblySymbol containingAssembly)
{
Debug.Assert(sourceType.Equals(destinationType, TypeCompareKind.AllIgnoreOptions));
// NOTE: overrides can differ by object/dynamic. If they do, we'll need to tweak newType before
// we can use it in place of this.Type. We do so by computing the dynamic transform flags that
// code gen uses and then passing them to the dynamic type decoder that metadata reading uses.
ImmutableArray<bool> flags = CSharpCompilation.DynamicTransformsEncoder.EncodeWithoutCustomModifierFlags(destinationType, refKind);
TypeSymbol typeWithDynamic = DynamicTypeDecoder.TransformTypeWithoutCustomModifierFlags(sourceType, containingAssembly, refKind, flags);
TypeSymbol resultType;
if (destinationType.ContainsTuple() && !sourceType.Equals(destinationType, TypeCompareKind.IgnoreCustomModifiersAndArraySizesAndLowerBounds | TypeCompareKind.IgnoreDynamic))
{
// We also preserve tuple names, if present and different
ImmutableArray<string> names = CSharpCompilation.TupleNamesEncoder.Encode(destinationType);
resultType = TupleTypeDecoder.DecodeTupleTypesIfApplicable(typeWithDynamic, containingAssembly, names);
}
else
{
resultType = typeWithDynamic;
}
Debug.Assert(resultType.Equals(sourceType, TypeCompareKind.IgnoreDynamicAndTupleNames)); // Same custom modifiers as source type.
Debug.Assert(resultType.Equals(destinationType, TypeCompareKind.IgnoreCustomModifiersAndArraySizesAndLowerBounds)); // Same object/dynamic and tuple names as destination type.
return resultType;
}
示例3: MergeTupleNames
/// <summary>
/// Returns first or a modified version of first with common tuple names from both types.
/// </summary>
internal static TypeSymbol MergeTupleNames(TypeSymbol first, TypeSymbol second)
{
if (first.Equals(second, TypeCompareKind.AllIgnoreOptions & ~TypeCompareKind.IgnoreTupleNames) ||
!first.ContainsTupleNames())
{
return first;
}
Debug.Assert(first.ContainsTuple());
ImmutableArray<string> names1 = CSharpCompilation.TupleNamesEncoder.Encode(first);
ImmutableArray<string> names2 = CSharpCompilation.TupleNamesEncoder.Encode(second);
ImmutableArray<string> mergedNames;
if (names1.IsDefault || names2.IsDefault)
{
mergedNames = default(ImmutableArray<string>);
}
else
{
Debug.Assert(names1.Length == names2.Length);
mergedNames = names1.ZipAsArray(names2, (n1, n2) => string.CompareOrdinal(n1, n2) == 0 ? n1 : null);
if (mergedNames.All(n => n == null))
{
mergedNames = default(ImmutableArray<string>);
}
}
return TupleTypeDecoder.DecodeTupleTypesIfApplicable(first, mergedNames);
}
示例4: MergeTupleNames
/// <summary>
/// Takes the names from the two types, finds the common names, and applies them onto the target.
/// </summary>
internal static TypeSymbol MergeTupleNames(TypeSymbol first, TypeSymbol second, TypeSymbol target, AssemblySymbol corLibrary)
{
if (!target.ContainsTuple() ||
first.Equals(second, TypeCompareKind.IgnoreCustomModifiersAndArraySizesAndLowerBounds | TypeCompareKind.IgnoreDynamic) ||
!target.ContainsTupleNames())
{
return target;
}
ImmutableArray<string> names1 = CSharpCompilation.TupleNamesEncoder.Encode(first);
ImmutableArray<string> names2 = CSharpCompilation.TupleNamesEncoder.Encode(second);
ImmutableArray<string> mergedNames;
if (names1.IsDefault || names2.IsDefault)
{
mergedNames = default(ImmutableArray<string>);
}
else
{
Debug.Assert(names1.Length == names2.Length);
mergedNames = names1.ZipAsArray(names2, (n1, n2) => string.CompareOrdinal(n1, n2) == 0 ? n1 : null);
if (mergedNames.All(n => n == null))
{
mergedNames = default(ImmutableArray<string>);
}
}
return TupleTypeDecoder.DecodeTupleTypesIfApplicable(target, corLibrary, mergedNames);
}