本文整理汇总了C#中Microsoft.CSharp.RuntimeBinder.Semantics.CType.fundType方法的典型用法代码示例。如果您正苦于以下问题:C# CType.fundType方法的具体用法?C# CType.fundType怎么用?C# CType.fundType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Microsoft.CSharp.RuntimeBinder.Semantics.CType
的用法示例。
在下文中一共展示了CType.fundType方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: isConstantInRange
public static bool isConstantInRange(EXPRCONSTANT exprSrc, CType typeDest, bool realsOk)
{
FUNDTYPE ftSrc = exprSrc.type.fundType();
FUNDTYPE ftDest = typeDest.fundType();
if (ftSrc > FUNDTYPE.FT_LASTINTEGRAL || ftDest > FUNDTYPE.FT_LASTINTEGRAL)
{
if (!realsOk)
{
return false;
}
else if (ftSrc > FUNDTYPE.FT_LASTNUMERIC || ftDest > FUNDTYPE.FT_LASTNUMERIC)
{
return false;
}
}
// if converting to a float type, this always succeeds...
if (ftDest > FUNDTYPE.FT_LASTINTEGRAL)
{
return true;
}
// if converting from float to an integral type, we need to check whether it fits
if (ftSrc > FUNDTYPE.FT_LASTINTEGRAL)
{
double dvalue = (exprSrc.asCONSTANT().getVal().doubleVal);
switch (ftDest)
{
case FUNDTYPE.FT_I1:
if (dvalue > -0x81 && dvalue < 0x80)
return true;
break;
case FUNDTYPE.FT_I2:
if (dvalue > -0x8001 && dvalue < 0x8000)
return true;
break;
case FUNDTYPE.FT_I4:
if (dvalue > I64(-0x80000001) && dvalue < I64(0x80000000))
return true;
break;
case FUNDTYPE.FT_I8:
// 0x7FFFFFFFFFFFFFFFFFFF is rounded to 0x800000000000000000000 in 64 bit double precision
// floating point representation. The conversion back to ulong is not possible.
if (dvalue >= -9223372036854775808.0 && dvalue < 9223372036854775808.0)
{
return true;
}
break;
case FUNDTYPE.FT_U1:
if (dvalue > -1 && dvalue < 0x100)
return true;
break;
case FUNDTYPE.FT_U2:
if (dvalue > -1 && dvalue < 0x10000)
return true;
break;
case FUNDTYPE.FT_U4:
if (dvalue > -1 && dvalue < I64(0x100000000))
return true;
break;
case FUNDTYPE.FT_U8:
// 0xFFFFFFFFFFFFFFFFFFFF is rounded to 0x100000000000000000000 in 64 bit double precision
// floating point representation. The conversion back to ulong is not possible.
if (dvalue > -1.0 && dvalue < 18446744073709551616.0)
{
return true;
}
break;
default:
break;
}
return false;
}
// U8 src is unsigned, so deal with values > MAX_LONG here.
if (ftSrc == FUNDTYPE.FT_U8)
{
ulong value = exprSrc.asCONSTANT().getU64Value();
switch (ftDest)
{
case FUNDTYPE.FT_I1:
if (value <= (ulong)SByte.MaxValue)
return true;
break;
case FUNDTYPE.FT_I2:
if (value <= (ulong)Int16.MaxValue)
return true;
break;
case FUNDTYPE.FT_I4:
if (value <= Int32.MaxValue)
return true;
break;
case FUNDTYPE.FT_I8:
if (value <= Int64.MaxValue)
return true;
break;
case FUNDTYPE.FT_U1:
//.........这里部分代码省略.........
示例2: BindIncOpCore
private EXPR BindIncOpCore(ExpressionKind ek, EXPRFLAG flags, EXPR exprVal, CType type)
{
Debug.Assert(ek == ExpressionKind.EK_ADD || ek == ExpressionKind.EK_SUB);
CONSTVAL cv = new CONSTVAL();
EXPR pExprResult = null;
if (type.isEnumType() && type.fundType() > FUNDTYPE.FT_LASTINTEGRAL)
{
// This is an error case when enum derives from an illegal type. Just treat it as an int.
type = GetReqPDT(PredefinedType.PT_INT);
}
FUNDTYPE ft = type.fundType();
CType typeTmp = type;
switch (ft)
{
default:
{
Debug.Assert(type.isPredefType(PredefinedType.PT_DECIMAL));
ek = ek == ExpressionKind.EK_ADD ? ExpressionKind.EK_DECIMALINC : ExpressionKind.EK_DECIMALDEC;
PREDEFMETH predefMeth = ek == ExpressionKind.EK_DECIMALINC ? PREDEFMETH.PM_DECIMAL_OPINCREMENT : PREDEFMETH.PM_DECIMAL_OPDECREMENT;
pExprResult = CreateUnaryOpForPredefMethodCall(ek, predefMeth, type, exprVal);
}
break;
case FUNDTYPE.FT_PTR:
cv.iVal = 1;
pExprResult = BindPtrBinOp(ek, flags, exprVal, GetExprFactory().CreateConstant(GetReqPDT(PredefinedType.PT_INT), cv));
break;
case FUNDTYPE.FT_I1:
case FUNDTYPE.FT_I2:
case FUNDTYPE.FT_U1:
case FUNDTYPE.FT_U2:
typeTmp = GetReqPDT(PredefinedType.PT_INT);
cv.iVal = 1;
pExprResult = LScalar(ek, flags, exprVal, type, cv, pExprResult, typeTmp);
break;
case FUNDTYPE.FT_I4:
case FUNDTYPE.FT_U4:
cv.iVal = 1;
pExprResult = LScalar(ek, flags, exprVal, type, cv, pExprResult, typeTmp);
break;
case FUNDTYPE.FT_I8:
case FUNDTYPE.FT_U8:
cv = GetExprConstants().Create((long)1);
pExprResult = LScalar(ek, flags, exprVal, type, cv, pExprResult, typeTmp);
break;
case FUNDTYPE.FT_R4:
case FUNDTYPE.FT_R8:
cv = GetExprConstants().Create(1.0);
pExprResult = LScalar(ek, flags, exprVal, type, cv, pExprResult, typeTmp);
break;
}
Debug.Assert(pExprResult != null);
Debug.Assert(!pExprResult.type.IsNullableType());
return pExprResult;
}