中易网

C#中自增自减运算符重载

答案:3  悬赏:0  
解决时间 2021-02-13 10:23
C#中自增自减运算符重载
最佳答案
一元运算符重载决策
op x 或 x op 形式的运算(其中 op 是可重载的一元运算符,x 是 X 类型的表达式)按下面这样处理:
• 对于由 X 为运算 operator op(x) 提供的候选的用户定义运算符的集合,应根据候选用户定义运算符规则来确定。
• 如果候选的用户定义运算符集合不为空,则它就会成为运算的候选运算符集合。否则,预定义一元 operator op 实现成为关于该运算的候选运算符集合。关于给定运算符的预定义实现,在有关运算符的说明中指定。
• 重载决策规则应用于候选运算符集合,以选择一个关于参数列表 (x) 的最好的运算符,此运算符将成为重载决策过程的结果。如果重载决策未能选出单个最佳运算符,则发生编译时错误。

候选用户定义运算符
给定一个 T 类型和运算 operator op(A),其中 op 是可重载的运算符,A 是参数列表,对 T 为 operator op(A) 提供的候选用户定义运算符集合按下面这样确定:
• 对于 T 中的所有 operator op 声明,如果关于参数列表 A 至少有一个运算符是适用的,则候选运算符集合由 T 中所有适用的 operator op 声明组成。
• 否则,如果 T 为 object,则候选运算符集合为空。
• 否则,由 T 提供的候选运算符集合是 T 的直接基类提供的候选运算符集合。

重载决策:
重载决策是一种编译时机制,用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。在 C# 内,重载决策在下列不同的上下文中选择一个应调用的函数成员:
• 要调用的方法的名称出现在 invocation-expression中。
• 要调用的实例构造函数的名称出现在 object-creation-expression中。
• 对一个索引器访问器的调用出现在 element-access中。
• 要调用的预定义运算符或用户定义的运算符出现在表达式中。
这些上下文中的每一个都以自己的唯一方式定义候选函数成员集和参数列表,上面列出的章节对此进行了详细说明。例如,方法调用的候选集不包括标记为 override的方法,而且如果派生类中的任何方法可用,则基类中的方法不是候选方法。
一旦确定了候选函数成员和参数列表,对最佳函数成员的选择在所有情况下都相同,都遵循下列规则:
• 如果给定了适用的候选函数成员集,则在其中选出最佳函数成员。如果该集合只包含一个函数成员,则该函数成员为最佳函数成员。否则,最佳函数成员的选择依据是:各成员对给定的参数列表的匹配程度。比所有其他函数成员匹配得更好的那个函数成员就是最佳函数成员,但有一个前提:必须使用更好的函数成员中的规则将每个函数成员与所有其他函数成员进行比较。如果不是正好有一个函数成员比所有其他函数成员都好,则函数成员调用不明确并发生编译时错误。

适用函数成员
当所有下列条件都为真时,就称函数成员对于参数列表 A 是一个适用的函数成员 (applicable function member):
• A 中的参数数目与函数成员声明中的参数数目相同。
• 对于 A 中的每个参数,实参的参数传递模式(即值、ref 或 out)与相应参数的参数传递模式相同,而且
o 对于值参数或参数数组,存在从实参类型到相应形参的类型的隐式转换,或者
o 对于 ref 或 out 参数,实参的类型与相应形参的类型相同。ref 或 out 参数毕竟只是传递的实参的别名。
对于包含参数数组的函数成员,如果按上述规则判定该函数成员是适用的,则称它以正常形式 (normal form) 适用。如果包含参数数组的函数成员以正常形式不适用,则该函数成员可能以展开形式 (expanded form) 适用:
• 构造展开形式的方法是:用形参数组的元素类型的零个或更多值参数替换函数成员声明中的形参数组,使实参列表 A 中的实参数目匹配总的形参数目。如果 A 中的实参比函数成员声明中的固定形参的数目少,则该函数成员的展开形式无法构造,因而可判定该函数成员不适用。
• 如果声明函数成员的类、结构或接口已经包含另一个与展开形式具有相同签名的适用函数成员,则展开形式不适用。
• 否则,如果对于 A 中的每个实参,它的实参传递模式与相应形参的形参传递模式相同,并且下列条件成立,则称该成员函数以展开形式适用:
o 对于固定值参数或展开操作所创建的值参数,存在从实参的类型到相应形参的类型的隐式转换,或者
o 对于 ref 或 out 参数,实参的类型与相应形参的类型相同。

更好的函数成员
给定一个带有参数类型集 { A1, A2, ..., AN } 的参数列表 A 和带有参数类型 { P1, P2, ..., PN } 和 { Q1, Q2, ..., QN } 的两个可应用的函数成员 MP 和 MQ,则在以下情况中,MP 定义为比 MQ 更好的函数成员 (better function member):
• 对于每个参数,从 AX 到 PX 的隐式转换都不比从 AX 到 QX 的隐式转换差,并且
• 对于至少一个参数,从 AX 到 PX 的转换比从 AX 到 QX 的转换更好。
当执行此计算时,如果 MP 或 MQ 以展开形式适用,则 PX 或 QX 所代表的是展开形式的参数列表中的参数。

invocation-expression 用于调用方法。
invocation-expression:
primary-expression ( argument-listopt )
invocation-expression 的 primary-expression 必须是方法组或 delegate-type 的值。如果 primary-expression 是方法组,则 invocation-expression 为方法调用。如果 primary-expression 是 delegate-type 的值,则 invocation-expression 为委托调用。如果 primary-expression 既不是方法组也不是 delegate-type 的值,则发生编译时错误。
可选的 argument-list列出的值或变量引用在调用时传递给方法中的参数。
invocation-expression 的计算结果按下面这样分类:
• 如果 invocation-expression 调用的方法或委托返回 void,则结果为 Nothing。Nothing 类别的表达式不能是任何运算符的操作数,并且只能在 statement-expression的上下文中使用。
• 否则,结果是由方法或委托返回的类型的值。

天啊,,,还有好多坑,,,没法给你写了,,,先看吧。。。
全部回答
如你现在创建了一个自定义类叫 苹果,正常情况下,如果你定义二个变量 苹果a和苹果b实例化它们,然后你想知道 苹果a-苹果b 能得到什么,默认这二个变量是不能直接运算的,如果你要实现 苹果 类的 "-" 运算,那么你必须重载它的 运算符"-",然后自己在里面实现你的操作。 比如 你可以实现说两个不同的菜果相减返回一个烂苹果或返回null public class apple{     public decimal weight{get;set;}     public static decimal operator +(apple a1, apple a2)    {          return a1.weight-a2.weight;    } } apple a=new apple{weight=200}; apple b=new apple{weight=300}; console.write(b-a);也是网上找的,不过感觉还是比较好理解的
// 前缀: operator++(yourclass& a); // 后缀:如i++; operator++(yourclass& a, int);
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
一千多点的家用打印复印一体机怎么选择?什么
双利粮店地址在什么地方,想过去办事
我收来的二手饲料袋哪里可以交,重庆市永川区
我好像已经忘记了什么是爱
蕉岭县城市建设综合开发公司地址在哪,我要去
48发动机的助力车要不要上牌照
叮当小吃怎么去啊,有知道地址的么
ss版恶魔城月下夜想曲用什么模拟器玩 用ePSXe
与341-41-59不相等的算式是(  ) A.34
西藏诱惑怎么去啊,有知道地址的么
蚂蚁花呗付款不属于支付宝付款?
墨岭怎么去啊,有知道地址的么
芝麻到底属于什么类的?是谷类还是豆类还是什
二的二十五次方是多少?、
语文词语选择题
推荐资讯
甲、乙两个消防队共有338人。抽调甲队人数的1
镜花水月下一句是什么
配一个可以玩绝地大逃杀的电脑,处理器i7,显
关于单反拍摄星空的问题
空六在哪里啊,我有事要去这个地方
高分悬赏啊打vray灯光、阳光后渲出场景很黑暗
platform.winmd 没有
江淮最近搞活动送行车记录仪
一个优秀的汽车维修工该具备怎样的素质和能力
美图m4用联通4g卡上在QQ却显示3g是怎么回事,
“树动悬冰落,枝高出手寒”是谁的诗?
刘记鲜榨果汁地址有知道的么?有点事想过去
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?