我有以下概念模型:
public interface IFoo<out T>
{
T Data { get; }
}
public struct Foo<T> : IFoo<T>
{
public Foo(T data) : this()
{
Data = data;
}
public T Data { get; private set; }
}
public class FooService<T>
{
...
public Foo<T> Get(string id)
{
...
}
}
然后我尝试以概念上等同于此的方式使用它:
// Create and register a few FooService instances
ServiceLocator.Register(new FooService<DateTime>(), "someServiceId");
ServiceLocator.Register(new FooService<double?>(), "anotherServiceId");
// Retrieve a particular FooService instance and call the Get method
var fooService = (FooService<object>)ServiceLocator.Get("someServiceId");
var foo = fooService.Get("someFooId");
我想在 FooService 实例上使用 Get() 方法 - 无论所选 FooService 实例返回什么类型。但是,此代码会导致以下异常:
Unable to cast object of type 'WindowsFormsApplication7.FooService`1[System.DateTime]' to type 'WindowsFormsApplication7.FooService`1[System.Object]'.
任何有关如何解决此问题的建议将不胜感激。
您可能会争辩说,为什么我首先要使 FooService 通用。但是,这样做是为了在类型安全的环境中确保类型安全。但是,在这种特殊情况下,FooService 应在 Web API Controller 中使用以服务于各种类型的 Foo。无论 T 的类型如何,它都应返回带有 Foo of T 的响应。
最佳答案
我想你已经给出了正确的答案:
FooService<double?>
永远不能转换为 FooService<object>
, 和
FooService<DateTime>
永远不能转换为 FooService<object>
.
使用协变或逆变不会改变这一点。本页https://msdn.microsoft.com/en-us/library/dd997386.aspx状态:Value types also do not support variance.
自 double?
和 DateTime
是值类型,这永远行不通。
关于c# - 无法转换通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29673519/