为什么不能通过泛型类型访问成员?
Why members cannot be accessed by generic type?
我不明白我在尝试从泛型 T 访问 class 的成员时做错了什么。我还专门使用了 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();
}
}
您没有提供 T 的实例。尝试:
public int IncrementId<T>(T t) where T : Test
{
return 1 + t.GetId();
}
将方法声明为泛型意味着您可以传递泛型类型的参数。所以你可以这样做:
public class TestUsage
{
public int IncrementId<T>(T test) where T : Test
{
return 1 + test.GetId();
}
}
通用类型参数 T
没有任何意义,除非具有该类型的东西被用作输入参数、return 值、T
类型的变量方法,或某种组合。
因为在 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());
另请参阅:
- Pass property itself to function as parameter in C#
- 我的 answer to the question How can I find a specific element in a List? 说明您不应使用方法
GetId
,而应使用 C# 中的 属性。
我不明白我在尝试从泛型 T 访问 class 的成员时做错了什么。我还专门使用了 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();
}
}
您没有提供 T 的实例。尝试:
public int IncrementId<T>(T t) where T : Test
{
return 1 + t.GetId();
}
将方法声明为泛型意味着您可以传递泛型类型的参数。所以你可以这样做:
public class TestUsage
{
public int IncrementId<T>(T test) where T : Test
{
return 1 + test.GetId();
}
}
通用类型参数 T
没有任何意义,除非具有该类型的东西被用作输入参数、return 值、T
类型的变量方法,或某种组合。
因为在 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());
另请参阅:
- Pass property itself to function as parameter in C#
- 我的 answer to the question How can I find a specific element in a List? 说明您不应使用方法
GetId
,而应使用 C# 中的 属性。