当尝试从通用类型T访问类的成员时,我不明白我在做什么错。我还专门使用了WHERE约束。 我收到以下消息:'T'是一个类型参数,在当前上下文中无效。
class Test
{
public static int id = 1;
public int GetId()
{
return id;
}
}
public class TestUsage
{
public int IncrementId<T>() where T : Test
{
return 1 + T.GetId();
}
}
答案 0 :(得分:1)
将方法声明为泛型意味着您可以传递泛型类型的参数。因此,您可以这样做:
public class TestUsage
{
public int IncrementId<T>(T test) where T : Test
{
return 1 + test.GetId();
}
}
除非类型类型的东西用作输入参数,返回值,方法中类型为T
的变量或某种组合,否则通用类型参数T
并不表示任何含义。
答案 1 :(得分:1)
由于在public int IncrementId<T>(T test)
中类型参数T
可以是任何类型,因此C#不知道此类型具有哪些成员。您可以添加通用类型约束。一种方法是定义一个类型必须用作类型实参的接口。
public interface IHasId
{
int GetId();
}
class Test : IHasId
{
public static int id = 1;
public int GetId()
{
return id;
}
}
public int IncrementId<T>(T item) where T : IHasId
{
return item.GetId() + 1;
}
另一种选择是将属性访问器传递给方法
public int IncrementId<T>(T item, Func<T, int> getId)
{
return getId(item) + 1;
}
您可以用
来称呼它int nextId = IncrementId(test, t => t.GetId());
另请参阅:
GetId
,而应使用C#中的属性。答案 2 :(得分:0)
您未提供T的实例。请尝试:
public int IncrementId<T>(T t) where T : Test
{
return 1 + t.GetId();
}