为什么不能通过通用类型访问成员?

时间:2019-06-04 17:52:18

标签: c# generics where

当尝试从通用类型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();
    }
}

3 个答案:

答案 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());

另请参阅:

答案 2 :(得分:0)

您未提供T的实例。请尝试:

public int IncrementId<T>(T t) where T : Test
{
    return 1 + t.GetId();
}