huzepiao 2016-11-22 10:51 采纳率: 100%
浏览 1663
已采纳

C# [疑似bug]关于泛型进行方法重载时遇到的问题, 不使用dynamic时会自动转换为object类型

在写一个项目时遇到了一个问题, 百思不得其解特意来CSDN求助,提供测试程序如下所示:

在对泛型对象使用重载方法时, T obj 会被自动识别为 object obj类型,
但测试 obj is T(手动输入一个类型) 时会返回true,
但是给obj 加上(dynamic)后 又能成功识别为T.

具体测试源码:
using System;

namespace ConsoleApplication38
{
public class builder
{
public static string t(DateTime dt) { return "进入了重载方法"+dt.Millisecond; }
public static string t(object obj) { return obj.ToString(); }
}
public class field
{
public T cache;
public string ToString1() { return builder.t((dynamic)cache); }
public string ToString2() { return builder.t(cache); }
//constructor
public field(T k) { cache = k; }
}
class Program
{
static void Main(string[] args)
{
field time = new field(DateTime.Now);
Console.WriteLine("type1:" + time.ToString1());
Console.WriteLine("type2:" + time.ToString2());
Console.ReadKey();
}
}
}

执行结果:
type1:进入了重载方法128
type2:2016-11-23 星期三 02-02-48-07 上午

预期结果应该是type1 和type2 相同才对, 求大神解答到底是什么地方出现了问题?
*class 执行的结果和 construction(T obj) 是一样的

展开全部

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-11-22 12:02
    关注

    不使用dynamic时会自动转换为object类型
    这很正常,因为 return builder.t(cache); 的调用是在编译期间确定的,而编译器编译field的时候不知道T的类型,它不可能为field使用一种类型推断,为别的类型使用另一种。

    return builder.t((dynamic)cache);则不同,编译器无法推测catche的类型(否则就不叫动态了),它在运行期间确定cache的类型(从IL层面看,用ldtoken指令,但是C#没有对应的语法),然后CLR动态确定重载类型,于是可以调用 t(DateTime dt) 的版本

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 代写uni代码,app唤醒
  • ¥15 全志t113i启动qt应用程序提示internal error
  • ¥15 ensp可以看看嘛.
  • ¥80 51单片机C语言代码解决单片机为AT89C52是清翔单片机
  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部