程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 對象-C# [疑似bug]關於泛型進行方法重載時遇到的問題, 不使用dynamic時會自動轉換為object類型

對象-C# [疑似bug]關於泛型進行方法重載時遇到的問題, 不使用dynamic時會自動轉換為object類型

編輯:編程解疑
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) 是一樣的

最佳回答:


不使用dynamic時會自動轉換為object類型
這很正常,因為 return builder.t(cache); 的調用是在編譯期間確定的,而編譯器編譯field的時候不知道T的類型,它不可能為field使用一種類型推斷,為別的類型使用另一種。

return builder.t((dynamic)cache);則不同,編譯器無法推測catche的類型(否則就不叫動態了),它在運行期間確定cache的類型(從IL層面看,用ldtoken指令,但是C#沒有對應的語法),然後CLR動態確定重載類型,於是可以調用 t(DateTime dt) 的版本

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved