我正在尝试创建一个静态函数,用另一个函数代替抽象类的实例。 (我简化了代码,将重点放在无法正常工作的地方):
abstract class AbstractData
{
public int MaxValue;
public int[] GivenValues;
}
static class AnalyzeData
{
static void Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData
{
T.GivenValues = abstractData.GivenValues; //error : T is a type parameter which is not valid in the given context
T.MaxValue= abstractData.GivenValues[0]; // same error
foreach (var data in abstractData.GivenValues)
{
if (data<limitValue){
T.MaxValue = data;
}
}
abstractData = T; //same error
}
}
在函数的定义中,我试图用AbstractData替换T,或者强制转换T,但是没有一个起作用。
我发现的唯一解决方案是使用Abstract Data的另一个实例作为参数(并具有“ in”和“ out”实例):
static void Analyze<T>(int limitValue, AbstractData abstractDataIn, AbstractData abstractDataOut)
但是那样的话,我将失去该函数通用部分的优势。
您知道为什么会出现此错误,以及如何纠正该错误吗?
谢谢!
答案 0 :(得分:3)
T
是Type
,而不是类型的实例。如果要创建并返回新实例,则必须这样写:
static T Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData, new()
{
T t = new T();
t.GivenValues = abstractData.GivenValues;
t.MaxValue= abstractData.GivenValues[0];
foreach (var data in abstractData.GivenValues)
{
if (data<limitValue){
t.MaxValue = data;
}
}
return t;
}
您的返回值为T
类型。
另一种选择是传递T
的实例:
static void Analyze<T>(int limitValue, AbstractData abstractData, T t) where T : AbstractData
{
t.GivenValues = abstractData.GivenValues;
t.MaxValue= abstractData.GivenValues[0];
foreach (var data in abstractData.GivenValues)
{
if (data<limitValue){
t.MaxValue = data;
}
}
}
然后,无需return
新创建的实例。