泛型类能通过构造函数推断出来么?

qq_41260532 2018-04-20 05:32:22
语文没学好,直接上图


一个泛型类,想通过构造函数传进的参数直接推断出类型。为什么不行呢?
泛型虽然一直在用,但没深入了解。
希望大神指教一下 谢谢
...全文
979 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-04-22
  • 打赏
  • 举报
回复
比如这个怎么推断
        class aaa<T>
        {
            public T a;
        }
xuzuning 2018-04-22
  • 打赏
  • 举报
回复
    public class Test<T>
    {
        public T data { get; set; }
 
        public Test(T t)
        {
            this.data = t;
        }
    }
从技术角度讲,C#完全有能力推断出 T 的类型。并且在其他场合下都是这么做的 但有参构造函数并不是必须的,对于无参构造函数,该如何推断类型呢? 所以 C# 才约定泛型类实例化时必须显式的声明类型
  • 打赏
  • 举报
回复
哦,上面的回复是回复 lz 的,不是回复 Saleayas 的哦。
  • 打赏
  • 举报
回复
引用 9 楼 Saleayas 的回复:
如果 Test 本身就有一个 int 参数的构造方法呢?
跟这些编程人员自己的想象无关,你按照目前的规范来思考才能解决实际问题,否则就是为未来而空想。 现在,类型推断就要求你的函数必须明确是哪一个 Class 的。例如 GetObject<T> 函数就是 Program 类自身的,编译器明确知道在 Program 类内部去找各个 GetObject<> 签名的方法,而不是去任意的什么未知的 Class 去找所谓 new 函数。 按照规范来编程,重在理解。你可以说几年之后c#也许会发明你说的这种东西,那是你自己说的。现在根本没有,所以不要反复纠结,如果你那么喜欢纠结那么就自己编写出类似 GetObject<> 这类代码来封装一下。如果自己不想封装、又纠结 c# 编译器语法,能有什么行动力?
qq_41260532 2018-04-21
  • 打赏
  • 举报
回复
引用 2 楼 daixf_csdn 的回复:
你为什么不上源代码而上图?因为这,我估计很多人不想看了,上源代码别人拷贝一下还可以帮你看看。与人方便就是与己方便。
新手,不太会
  • 打赏
  • 举报
回复
顺便说一下,你“不喜欢”写
var ccc = new Test<int>(aaa);
这是你个人的习惯问题,是个小问题,这跟 var 不一样(那是许多编程语言的潮流)。c# 的语法糖已经很好了。
  • 打赏
  • 举报
回复
c#,没有什么“使用构造函数进行推断”的功能,你必须先明确说明你调用的是哪一个 Class 中的代码才能推断函数返回类型(你不说名函数是哪一个 Class 的函数,这是不行的)。自己封装一下。
    public class Test<T>
    {
        public T data { get; set; }

        public Test(T t)
        {
            this.data = t;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int aaa = 1;
            //一样不行
            var ccc = GetObject(aaa);
            Console.WriteLine($"ccc的类型为{ccc.GetType().FullName}");
        }

        static Test<T> GetObject<T>(T x)
        {
            return new Test<T>(x);
        }
    }
xuzuning 2018-04-21
  • 打赏
  • 举报
回复
这不是你想不想的问题,编译器不愿替你推断,你又奈何
Saleayas 2018-04-21
  • 打赏
  • 举报
回复
如果 Test 本身就有一个 int 参数的构造方法呢?
qq_41260532 2018-04-21
  • 打赏
  • 举报
回复
引用 1 楼 jiergio 的回复:
泛型表达是静态的类型。 你却要用动态的类型。 这不是矛盾了。。

namespace CTest
{

    public class Test<T>
    {
        public T data { get; set; }

        public Test(T t)
        {
            this.data = t;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int aaa = 1;
           //一样不行
           object ccc = new Test(aaa);
          //不想写这个<int>,希望通过aaa这个参数类型推断出来
          //object ccc = new Test<int>(aaa);
        }
    }
}
圣殿骑士18 2018-04-20
  • 打赏
  • 举报
回复
你为什么不上源代码而上图?因为这,我估计很多人不想看了,上源代码别人拷贝一下还可以帮你看看。与人方便就是与己方便。
csdn网速很慢 2018-04-20
  • 打赏
  • 举报
回复
泛型表达是静态的类型。 你却要用动态的类型。 这不是矛盾了。。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧