【发布时间】:2014-02-10 06:45:46
【问题描述】:
我对此感到很困惑,所以如果有人有任何想法。我有通用方法
public void Foo<TClass>(TClass item) where TClass : class
{ }
我想从另一个泛型方法调用这个方法,但是这个泛型方法没有类型约束“where TClass : class”
public void Bar<T>(T item)
{
this.Foo<T>(item);
}
这不起作用,我收到错误
"类型 'T' 必须是引用类型才能将其用作参数 'TClass'"
我明白了。但我的问题是——如果它是一个类,我可以用 C# 语法做些什么来“过滤”泛型类型“T”以将其传递给“this.Bar”。有点像....
public void Bar<T>(T item)
{
if (typeof(T).IsClass)
this.Foo<T **as class**>();
}
我意识到我可以使用反射来调用 Foo,但这似乎是作弊。我可以用 C# 做些什么来在运行时通过约束传递“T”吗?
另外 - 我无法更改方法“Bar”的约束,因为它来自接口,因此约束必须与接口上的约束匹配
【问题讨论】:
-
你的意思是“this.Foo
();” ? -
很好发现 - 已编辑 :)
-
那你为什么不用
if (typeof (T).IsClass)?? -
因为编译器不会读取该逻辑,所以我在执行此操作时仍然会出现编译错误。Foo
(item) -
@horrorcat 啊,对不起,现在我明白你了,看来你需要反思,用你的话作弊 :)
标签: c# generics constraints