gpt4 book ai didi

C# 强制转换为通用接口(interface)中的对象

转载 作者:行者123 更新时间:2023-11-30 14:56:06 25 4
gpt4 key购买 nike

我有一个问题,我不明白关于在泛型接口(interface)中进行转换(可能是因为目前我还不完全清楚协变和逆变)。

我有一个接口(interface),我在其中定义了一个 getter 和 setter,它们应该以类型化的方式接受任何东西(没有对象作为类型)例如:

public interface IDummy <T>
{
int SomeCommonMethod() ;
T Anything { get; set; }
}

现在我定义了之前定义的接口(interface)的一些具体实现。

public class MyStrObj : IDummy <string>
{
private string _stirngVal = string.Empty ;

public int SomeCommonMethod()
{
return 0 ;
}

public string Anything
{
get { return _stirngVal ; }
set { _stirngVal = value ; }
}
}

public class MyFileObj : IDummy <File>
{
private File _file = null ;

public int SomeCommonMethod()
{
return 0 ;
}

public File Anything
{
get { return _file ; }
set { _file = value ; }
}
}

当时一切都按预期工作,但现在当尝试使用这两个对象时,它们的行为开始让我感到困惑。

我尝试定义一个对象,该对象应该能够使用之前的两个类(无论它们的泛型中有哪种类型,重要的是它们是 IDummy)。

public class Consumer
{
public static void Consume ( IDummy<object> obj )
{
//SOME CODE HERE.
}
}

现在,如果我尝试这段代码:

MyStrObj obj = new MyStrObj () ;
Consumer.Consume ( obj ) ;

然后编译器通知我调用 Consume 方法时有一些无效参数(obj 确定),但这里没有隐式转换?

如果我改用这种方式:

MyStrObj obj = new MyStrObj () ;
Consumer.Consume ( (IDummy<object>)obj ) ;

编译器似乎按照我的预期工作(当时我还没有测试这两个调用是否等价)。

提前感谢任何可以帮助我理解这种行为的人,并为我的英语(不是我的语言)感到抱歉。

最佳答案

你的 IDummy<T>不是协变的。这就是 such 的隐式转换不起作用的原因。如果它是协变的,那么从更具体的通用类型到更通用的类型的转换就会起作用。但是,在您的示例中,您不能使接口(interface)协变 IDummy<out T> ,因为它有一个带有通用参数的属性 setter 。

关于C# 强制转换为通用接口(interface)中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23839534/

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