我想知道为什么泛型类型参数的新约束只能在没有参数的情况下应用,也就是说,可以将类型约束为具有无参数构造函数,但是不能将类约束为具有构造函数,接收一个int作为参数.我知道这方面的方法,使用反射或工厂模式,工作正常,好吧.但我真的很想知道为什么,因为我一直在思考它,我真的想不出无参数构造函数和带有参数的区别,这些参数可以证明对新约束的这种限制.我错过了什么?非常感谢
@Eric:让我和你在一起一会儿:
构造函数是方法
那么我想如果我这样做,没有人会反对:
public interface IReallyWonderful
{
new(int a);
string WonderMethod(int a);
}
Run Code Online (Sandbox Code Playgroud)
但是一旦我有了,那我就去:
public class MyClass<T>
where T : IReallyWonderful
{
public string MyMethod(int a, int b)
{
T myT = new T(a);
return myT.WonderMethod(b);
}
}
Run Code Online (Sandbox Code Playgroud)
这首先是我想要做的.所以,抱歉,但不,构造函数不是方法,或者至少不完全.
关于实现这个功能的困难,我真的不知道,即使我这样做了,我对于明智地支出股东资金的决定也没什么可说的.这样的话,我会马上把它标记为答案.
从学术(我)的角度来看,也就是说,没有任何关于实施成本的问题,问题确实是(我在最近几个小时内完成了这个问题):
构造函数应该被视为类的实现的一部分,还是作为语义契约的一部分(以同样的方式将接口视为语义契约).
如果我们将构造函数视为实现的一部分,那么,约束泛型类型参数的构造函数不是一件非常通用的事情,因为这会将你的泛型类型绑定到具体的实现,并且几乎可以说为什么完全使用泛型?
作为实现的一部分的构造函数的示例(在指定任何下面的构造函数作为定义的语义契约的一部分时没有意义ITransformer):
public interface ITransformer
{
//Operates with a and returns the result;
int Transform(int a);
}
public class PlusOneTransformer : ITransformer
{
public int Transform(int a)
{
return a …Run Code Online (Sandbox Code Playgroud) 我有一个包装器泛型类,旨在与一组类型一起使用.这些类型由实用程序生成,并且都是从基类ClientBase派生的.虽然ClientBase只有一个默认构造函数,但所有生成的类型都有默认构造函数,构造函数则将字符串作为参数.在包装器类的构造函数中,我使用带有字符串的构造函数实例化该类型的实例.这是一个示例代码:
public class ClientBase
{ }
public class GenericProxy<T>
where T: ClientBase, new()
{
T _proxy;
public GenericProxy(string configName)
{
_proxy = new T(configName);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为不保证类型T具有接受字符串的构造函数.有没有办法在泛型类上定义约束来强制类型T必须有一个带字符串的构造函数?如果这是不可能的,那么处理这种情况的好方法是什么?
我有一组对象,我作为参数传递给另一种类型的对象(一对一).我在很多地方这样做(基本上是从数据对象转换为业务对象).我想写一个通用的扩展方法来实现这一目标.但我被卡住了,因为我不知道如何指定业务对象具有将数据对象作为参数的构造函数的约束.以下是我的功能代码:
public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list)
where T : new(A)/*THIS IS PROBLEM PART*/
{
var ret = new List<T>();
foreach (var item in list)
{
ret.Add(new T(item));
}
return ret;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试做这样的事情:
其中 DataTableLoader2 是一个通用的帮助类
public static class DataTableLoader2 <T> where T : class, new (StringComparer)
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助......
钾