c# - 将简单对象转换为简单通用的接口(interface)

标签 c# generics types parameters casting

我正在寻找一种将对象转换为简单接口(interface)和派生自简单接口(interface)的通用接口(interface)的方法。

这是我的例子:

interface INonGeneric
{

}

interface IGeneric<T> : INonGeneric where T : ITypeParameter
{
    T Build();
}

interface ITypeParameter
{

}

class TypeClass : ITypeParameter
{

}

这就是我尝试使用的设计。如果我对泛型的理解有缺陷(我想确实如此),那么这个错误对你来说是显而易见的。

然后我创建我想使用的类:

class MyClass : MyClassBase<TypeClass>
{
    public override TypeClass Build()
    {
        return new TypeClass();
    }
}

abstract class MyClassBase<T> : IGeneric<T> where T : ITypeParameter
{
    public abstract T Build();
}

然后我尝试像这样转换它们:

void Main()
{
    var myClass = new MyClass();

    var cast1 = myClass as INonGeneric;
    if(cast1 != null) Console.WriteLine("cast 1 works!"); //THIS WORKS
    var cast2 = TestCast<ITypeParameter>(myClass);
    if(cast2 != null) Console.WriteLine("cast 2 works!"); //THIS DOES NOT WORK
}

如有任何帮助,我们将不胜感激。

编辑:抱歉,我忘了放入 TestCast 方法。在这里:

IGeneric<T> TestCast<T>(INonGeneric obj) where T : ITypeParameter
{
    return obj as IGeneric<T>;
}

最佳答案

由于协方差问题,这不起作用。 考虑这个示例代码。

var liInt = new List<int>() { 1,2,3};
var liObj = List<object>(liInt);

在那之后,您可以认真地向 liObj 添加一些非整数值,显然,这是不可行的。

bool b = false;
liObj.Add(b);

为防止这种情况,您应该隐含地告诉您您仅在返回位置使用您的通用类型,而不是在输入中。例如:

interface IGeneric<out T> : INonGeneric where T : ITypeParameter

更多信息请查看以下链接: http://tomasp.net/blog/variance-explained.aspx/

关于c# - 将简单对象转换为简单通用的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199451/

相关文章:

c# - 将控件从一个选项卡页移动到另一个选项卡页

c# - 协变和逆变 - 调用有保证的基类行为的不同机制?

c# - 将 95 阶乘打印为数字而不是指数函数

java - 使用泛型类时 lambda 使用者参数的类型未知

C# 泛型类作为参数,T 与泛型类的调用方法相同

haskell - 如何编写这些函数以独立于类型 : Int vs Integer 的选择

c# - 在 XAML 中使用 System.Type

c# - 我如何在 C# 中制作参数 `out`?

c# - C# .Net 中 XmlElement 中的空白

java - 什么是具体泛型?它们如何解决类型删除问题,为什么不进行重大更改就不能添加它们?