gpt4 book ai didi

c# - 同时使用值和引用类型的泛型的协方差解决方法

转载 作者:行者123 更新时间:2023-11-30 16:40:35 24 4
gpt4 key购买 nike

前言:我知道协方差目前不适用于值类型(参见 [1][2] )。


我有一个泛型可以简化如下:

public interface IDynamicValue<out T>
{
T Get(Context context);
}
public abstract class DynamicValue<T> : IDynamicValue<T>
{
public abstract T Get(Context context);
}

类型T在不同情况下被用作引用类型和值类型。

现在我遇到了类似下面的情况:

public class SomeClass
{
public object thing;

public string ObjectToString(Context context)
{
if (thing is IDynamicValue<object>)
{
return (thing as IDynamicValue<object>).Get(context).ToString();
}

return thing.ToString();
}
}

感谢协方差,如果我传递 DynamicValue<string>作为对象,那么它将成功转换为 IDynamicValue<object>Get函数将被执行。

但是,如果我传递 DynamicValue<int> ,它不会被转换(如前所述,我明白为什么会这样),并且 o.ToString()将被退回。

有什么解决方法可以让我执行 Get(context)引用和值类型的函数 DynamicValues在这个情况下?如果可能的话,不使用反射的荣誉 :D

最佳答案

也许,你可以添加一个没有泛型的接口(interface),并用它标记一些类:

public interface IDynamicValue
{
object Get(Context context);
}

public interface IDynamicValue<out T>
{
T Get(Context context);
}

并检查:

public class SomeClass
{
public object thing;

public string ObjectToString(Context context)
{
if (thing is IDynamicValue<object>)
{
return (thing as IDynamicValue<object>).Get(context).ToString();
}

if (thing is IDynamicValue)
{
return (thing as IDynamicValue).Get(context).ToString();
}

return thing.ToString();
}
}

关于c# - 同时使用值和引用类型的泛型的协方差解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51095269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com