Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类及其接口之间的引用转换_C# - Fatal编程技术网

C# 类及其接口之间的引用转换

C# 类及其接口之间的引用转换,c#,C#,我有一个实现接口的类: public interface IMyInterface { string MY_VALUE { get; set; } } public class MyClass: IMyInterface { public string MY_VALUE { get; set; } } 我正在列表中使用该类: private List<MyClass> MyInternal; public List<IMyInterface> MyEx

我有一个实现接口的类:

public interface IMyInterface
{
    string MY_VALUE { get; set; }
}

public class MyClass: IMyInterface
{
    public string MY_VALUE { get; set; }
}
我正在列表中使用该类:

private List<MyClass> MyInternal;
public List<IMyInterface> MyExternal
{
    get
    {
        return MyInternal;
    }
}

这将失败,因为MyExternal没有映射到MyInternal,而是映射到一个新列表。如何实现此功能?

即使
MyClass
实现了
MyInterface
,也不能将
List
转换为
List

如果可以将其转换为
列表
,则必须能够向其中添加实现
MyInterface
的任何内容,即使它不是
MyClass
。如果您可以将其转换为一个
列表
,将该引用传递给另一个方法,那么该方法会“认为”它可以向该列表添加其他内容,而实际上该列表中唯一可以添加的内容是
MyClass
。我们从未遇到过这种情况,因为编译器会阻止它

如果您有一个
列表
并且想要一个
列表
,您可以这样做

var listOfMyInterface = listOfMyClass.Cast<MyInterface>().ToList();
var listOfMyInterface=listOfMyClass.Cast().ToList();
想象一下我做了一个

public class MyClass2: IMyInterface
{
    public string MY_VALUE { get; set; }
}
然后我做到了

someClass.MyExternal.Add(new MyClass2())
它必须将
MyClass2
添加到
私有列表MyInternal
对象中,这是不允许的。这就是为什么你不能这么做

要绕过它,您必须公开一个共变接口(只允许读取列表,不允许写入,并且类型为
out T
),这就是接口的用途,并且
list
实现该接口

private List<MyClass> MyInternal;
public IReadOnlyList<IMyInterface> MyExternal
{
    get
    {
        return MyInternal;
    }
}

您真的希望列表中有任何实现接口的对象,还是只希望列表中有
MyClass
实例?你不能两者兼得;所以只要选择一个。
列表
不是协变的。如果将
MyExternal
定义为
IEnumerble
,则可以从中返回
List
,因为
IEnumerable
不允许传递可能不是
MyClass
IMyInterface
。但听起来,如果您计划添加到列表中,您只想公开
List
IEnumerable@YongkeBillYu事实上,因为增加的能力是它不起作用的原因。那种挫败了我服务的目的
someClass.MyExternal.Add(new MyClass2())
private List<MyClass> MyInternal;
public IReadOnlyList<IMyInterface> MyExternal
{
    get
    {
        return MyInternal;
    }
}
private List<IMyInterface> MyInternal;
public List<IMyInterface> MyExternal
{
    get
    {
        return MyInternal;
    }
}