加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何初始化泛型参数类型T?

发布时间:2020-12-15 03:53:01 所属栏目:百科 来源:网络整理
导读:简单问题: 如果你有一个字符串x,要初始化它,你可以简单地执行以下操作之一: string x = String.Empty; 要么 string x = null; 通用参数T如何? 我试过: void someMethodT(T y){ T x = new T(); ...} 生成错误: 无法创建变量类型“T”的实例,因为它不具有
简单问题:
如果你有一个字符串x,要初始化它,你可以简单地执行以下操作之一:
string x = String.Empty;

要么

string x = null;

通用参数T如何?

我试过:

void someMethod<T>(T y)
{
    T x = new T();  
    ...
}

生成错误:
无法创建变量类型“T”的实例,因为它不具有new()约束

解决方法

你有两个选择:

你可以约束T:你可以通过在你的方法中添加:T:new()来做到这一点.现在,您只能使用someMethod类型,该类型具有无参数,默认构造函数(参见Constraints on Type Parameters).

或者使用默认(T).对于引用类型,这将给出null.但是,例如,对于整数值,这将为0(参见default Keyword in Generic Code).

这是一个基本的控制台应用程序,显示了区别:

using System;

namespace Stackoverflow
{
    class Program
    {
        public static T SomeNewMethod<T>()
            where T : new()
        {
            return new T();
        }

        public static T SomeDefaultMethod<T>()
            where T : new()
        {
            return default(T);
        }

        struct MyStruct { }

        class MyClass { }

        static void Main(string[] args)
        {
            RunWithNew();
            RunWithDefault();
        }

        private static void RunWithDefault()
        {
            MyStruct s = SomeDefaultMethod<MyStruct>();
            MyClass c = SomeDefaultMethod<MyClass>();
            int i = SomeDefaultMethod<int>();
            bool b = SomeDefaultMethod<bool>();

            Console.WriteLine("Default");
            Output(s,c,i,b);
        }

        private static void RunWithNew()
        {
            MyStruct s = SomeNewMethod<MyStruct>();
            MyClass c = SomeNewMethod<MyClass>();
            int i = SomeNewMethod<int>();
            bool b = SomeNewMethod<bool>();

            Console.WriteLine("New");
            Output(s,b);
        }

        private static void Output(MyStruct s,MyClass c,int i,bool b)
        {
            Console.WriteLine("s: " + s);
            Console.WriteLine("c: " + c);
            Console.WriteLine("i: " + i);
            Console.WriteLine("b: " + b);
        }

    }
}

它产生以下输出:

New
s: Stackoverflow.Program+MyStruct
c: Stackoverflow.Program+MyClass
i: 0
b: False
Default
s: Stackoverflow.Program+MyStruct
c:
i: 0
b: False

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读