c# - 无法转换通用对象

标签 c# generics covariance

我有以下概念模型:

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/

相关文章:

c# - MVC 自定义角色提供者未被击中

c# - 为什么 C# 编译器无法理解单独类中使用的泛型参数?

c# - 从 IEnumerable<Object> 转换为 IEnumerable<string>

java - 如何修复Java中的 'incompatible types: SomeObject cannot be converted to CAP#1'错误

c# - 从三个表中检索数据

c# - 从其他应用程序的入口点启动应用程序android

c# - 通过 DataAnnotation 强制外键列名称不起作用

c# - 用于计算列表中给定子类出现次数的通用方法以及未找到 Type 参数的原因

javascript - 创建速记类型时重用扩展接口(interface)的泛型类型

c++ - 协变虚函数返回类型问题