Я борюсь с тем, как правильно использовать C# Generics. В частности, я хочу иметь метод, который принимает универсальный тип в качестве параметра и выполняет разные действия в зависимости от типа универсального. Но я не могу «унизить» общий тип. См. пример ниже.
Компилятор жалуется на приведение (Bar<Foo>)
, говоря: «Невозможно преобразовать тип Bar<T>
в Bar<Foo>
». Но во время выполнения приведение в порядке, так как я проверил тип.
public class Foo { }
public class Bar<T> { }
// wraps a Bar of generic type Foo
public class FooBar<T> where T : Foo
{
Bar<T> bar;
public FooBar(Bar<T> bar)
{
this.bar = bar;
}
}
public class Thing
{
public object getTheRightType<T>(Bar<T> bar)
{
if (typeof(T) == typeof(Foo))
{
return new FooBar<Foo>( (Bar<Foo>) bar); // won't compile cast
}
else
{
return bar;
}
}
}
return new FooBar<Foo>(bar as Bar<Foo>)
? - person Corey Adler   schedule 30.10.2012object
вместо более конкретного типа. Другое преимущество обобщений заключается в том, что один и тот же код можно использовать для нескольких типов, но вы теряете часть этого преимущества, разветвляя реализацию на основе типа аргумента. Я не знаю, как выглядит реальная программа, но, возможно, это показатель того, что возможна лучшая структура программы. Каково назначение функции getTheRightType? И как используется результат? - person Mike   schedule 30.10.2012