调用非泛型方法并使用不同泛型类型传递泛型参数的解决方案?
我想象中的梦想:
void FooBulous(Foo<object>[] fooArray) { } // Accept any 'Foo<BaseType>'
var fooArray = new Foo<object>[] // Array of 'Foo<BaseType>'
{
new Foo<Cat>(),
new Foo<Dog>(),
};
FooBulous(fooArray); // Pass the 'Foo<BaseType>[]' array
我的现实:
void BarBaric(object[] barArray) { } // Can't constrain to 'Foo<>'
var barArray = new object[] // Same problem
{
new Bar<Cat>(),
new Bar<Dog>(),
};
BarBaric(barArray); // Barbaric! I thought the 'void *ptr' days were over!
总结:
void Fee(object[] params) { /* WORKS! But not constrained to 'Foo<Base>' */ }
void Fie(Foo<Cat>[] params) { /* Does not accept 'Foo<Dog>' */ }
void Foe(Foo<>[] params) { /* ERROR: 'Type expected' */ }
void Fum(Foo<object>[] params) { /* Cannot convert 'Foo<Cat>' to 'Foo<object>' */ }
显然,这是不可能的......有一个干净的选择吗?
答案 0 :(得分:5)
问题是Foo<Cat>
不是Foo<object>
。假设Foo
看起来像这样:
public class Foo<T>
{
public void Method(T input)
{
...
}
}
然后,Foo<Cat>
总是希望Cat
参数的input
值为Method
。但是,如果您可以将Foo<Cat>
视为Foo<object>
,您可以这样做:
Foo<Cat> catFoo = new Foo<Cat>();
Foo<object> objectFoo = catFoo;
objectFoo.Method(new object()); // Eek! Type safety is broken!
现在泛型差异在.NET 4(和C#4)中可用,但仅用于用于接口和委托,而仅用于用于装饰的那些适用于类型参数声明点out
和in
。这可能对你有用,也可能没用。
另一种选择是使Foo<T>
派生自抽象的非泛型基类Foo
,它提供与T
无关的所有成员。然后你可以写:
void Foobulous(Foo[] fooArray)
...
Foobulous(new Foo[] {
new Foo<object>(),
new Foo<Cat>(),
new Foo<Dog>()
});
只要Foobulous
不需要使用依赖于T
的任何方法 - 而且它不应该使用Foo
,所以一切都会好的,因为它可能需要{{1}无论如何,具有不同类型参数的值。