我试图创建一个静态函数替换另一个抽象类的实例。 (我简化了代码,专注于它不起作用的地方):
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)
但是后来我将失去函数通用部分的优势。
你知道为什么我有这个错误,我怎么能纠正它?
谢谢 !
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
新创建的实例了。