如何在c#5.0中实现此代码 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 名称空间Test1 { 公共类new泛型,其中T:new(int) { } }

如何在c#5.0中实现此代码 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 名称空间Test1 { 公共类new泛型,其中T:new(int) { } },c#,c#-5.0,C#,C# 5.0,如何正确编写此代码,使其能够使用C#5.0进行编译?一种方法是使用new()和设置整数值的接口进行欺骗/变通: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { public class NewGenerics<T> where T:new(int) { } } namespace Test1 {

如何正确编写此代码,使其能够使用C#5.0进行编译?

一种方法是使用new()和设置整数值的接口进行欺骗/变通:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    public class NewGenerics<T> where T:new(int)
    {

    }
}
namespace Test1
{
公共类new泛型,其中T:IMyInterface,new()
{
私有静态T创建(int theInteger)
{
var inst=新的T();
仪器设置积分仪(积分仪);
返回仪表;
}
....
}
}
您可以使用Create方法创建实例,并使用整数或您需要的任何值初始化它们


如果您可以强制所有类型实现特定接口,即..

不幸的是,当前C#版本中支持的一组泛型约束不允许指定除无参数构造函数之外的任何必需构造函数签名

实现这一点的唯一方法是使用反射进行运行时检查。您可以使用来检索
T
的实例,然后使用来检索所有构造函数的实例。使用这些,您可以检查
T
中的任何构造函数是否具有所需的签名,否则将抛出异常。。。在
NewGenerics
类的每个构造函数中


这个解决方案的缺点是它只在运行时被检查;只要有人试图创建你的类的实例,它仍然会很高兴地编译并抛出。

不可能,只支持new(),你想实现什么?@rkrahl:显然,OP正在寻求一种方法来放置一个通用约束,该约束要求
T
拥有一个接受
int
值的构造函数。@O.R.Mapper-也许对您来说是清楚的。@Oded:对不起,我通常只需要一个详细详细的解释,而不是纯粹的源代码,但是当
new()
时,即
new
,用于调用构造函数的关键字和要求构造函数具有空参数列表的空参数列表
()
,被修改为
new(int)
,即
new
,用于调用构造函数的关键字和
(int)
,具有
int
的参数列表,我认为如何解释这一点非常简单。任何其他东西,比如
newint
new[[int]]
,我都不会这么清楚;-)在这种情况下,
T
中的
int
字段不能声明为
readonly
,但是,对于构造函数中设置的值(只有以前设置过的值),这是偶尔需要的。因此,“欺骗/变通方法”就是这样。。不可能创建此约束,因此所有解决方案都是变通方法。当然,我认为指出每个变通方法的缺点很重要,这样OP就有了更好的决策基础。如果该接口可以按照您的建议实现,那么您的接口当然是一个很好的解决方案,它甚至允许编译时检查。
namespace Test1
{
    public class NewGenerics<T> where T: IMyInterface, new()
    {
         private static T Create(int theInteger)
         {
              var inst = new T();
              inst.SetTheInteger(theInteger);
              return inst;
         }


         ....
    }
}