本文整理汇总了C#中IGenericParameter.GetTypeConstraints方法的典型用法代码示例。如果您正苦于以下问题:C# IGenericParameter.GetTypeConstraints方法的具体用法?C# IGenericParameter.GetTypeConstraints怎么用?C# IGenericParameter.GetTypeConstraints使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IGenericParameter
的用法示例。
在下文中一共展示了IGenericParameter.GetTypeConstraints方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ViolatesParameterConstraints
/// <summary>
/// Checks if a specified type argument violates the constraints
/// declared on a specified type paramter.
/// </summary>
public bool ViolatesParameterConstraints(IGenericParameter parameter, IType argument)
{
// Ensure argument is a valid type
if (argument == null || TypeSystemServices.IsError(argument))
{
return false;
}
bool valid = true;
// Check type semantics constraints
if (parameter.IsClass && !argument.IsClass)
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustBeReferenceType(ConstructionNode, parameter, argument));
valid = false;
}
if (parameter.IsValueType && !argument.IsValueType)
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustBeValueType(ConstructionNode, parameter, argument));
valid = false;
}
if (parameter.MustHaveDefaultConstructor && !HasDefaultConstructor(argument))
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustHaveDefaultConstructor(ConstructionNode, parameter, argument));
valid = false;
}
// Check base type constraints
IType[] baseTypes = parameter.GetTypeConstraints();
if (baseTypes != null)
{
foreach (IType baseType in baseTypes)
{
// Don't check for System.ValueType supertype constraint
// if parameter also has explicit value type constraint
if (baseType == _tss.ValueTypeType && parameter.IsValueType)
continue;
if (!baseType.IsAssignableFrom(argument))
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustHaveBaseType(ConstructionNode, parameter, argument, baseType));
valid = false;
}
}
}
return !valid;
}
示例2: MaintainsParameterConstraints
private bool MaintainsParameterConstraints(IGenericParameter parameter, IType argument)
{
if (argument == null || TypeSystemServices.IsError(argument))
return true;
if (argument == parameter)
return true;
if (argument == _typeSystemServices.VoidType)
{
Errors.Add(CompilerErrorFactory.InvalidGenericParameterType(ConstructionNode, argument));
return false;
}
bool valid = true;
// Check type semantics constraints
if (parameter.IsClass && !(argument.IsClass || argument.IsInterface))
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustBeReferenceType(ConstructionNode, parameter, argument));
valid = false;
}
if (parameter.IsValueType && !argument.IsValueType)
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustBeValueType(ConstructionNode, parameter, argument));
valid = false;
}
// Don't check for default constructor constraint if value type constraint failed
else if (parameter.MustHaveDefaultConstructor && !HasDefaultConstructor(argument))
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustHaveDefaultConstructor(ConstructionNode, parameter, argument));
valid = false;
}
// Check base type constraints
IType[] baseTypes = parameter.GetTypeConstraints();
if (baseTypes != null)
{
foreach (IType baseType in baseTypes)
{
// Foo<T> where T : Foo<T>
if (null != _definition
&& TypeCompatibilityRules.IsAssignableFrom(baseType, _definition)
&& argument == _constructionNode.ParentNode.Entity)
continue;
// Don't check for System.ValueType supertype constraint
// if parameter also has explicit value type constraint
if (baseType == _typeSystemServices.ValueTypeType && parameter.IsValueType)
continue;
if (!TypeCompatibilityRules.IsAssignableFrom(baseType, argument))
{
Errors.Add(CompilerErrorFactory.GenericArgumentMustHaveBaseType(ConstructionNode, parameter, argument, baseType));
valid = false;
}
}
}
return valid;
}