gpt4 book ai didi

c# - 转换为具有接口(interface)的通用类

转载 作者:行者123 更新时间:2023-11-30 15:27:12 25 4
gpt4 key购买 nike

根据 MarcinJuraszek 的输入更新

我觉得我在这里遇到了协方差/逆方差问题,但我不确定我是否理解如何解决它。我有这样一个类:

public interface ISomeClass<TEnum, out S>
{
TEnum Dim { get; }
IEnumerable<S> Inc { get; }
}

public class SomeClass<TEnum, S> : ISomeClass<TEnum, S>
where TEnum : struct, IConvertible
where S : IMyInterface
{
public TEnum Dim { get; set; }
public IEnumerable<S> Inc { get; set; }
}

我有一个实现 IMyInterface 的类

public class MyImplementation : IMyInterface
{

}

当然,我有一个带有 SomeClass 的类属性:

public class MyContainer<TEnum> where TEnum : struct, IConvertible
{
public SomeClass<TEnum, IMyInterface> MyProp { get; set; }
}

现在我的问题是我无法分配 SomeClass<MyEnum, MyImplementation>MyProp属性,因为我得到一个 InvalidCastException在运行时提示它无法转换 SomeClass<MyEnum, MyImplementation>SomeClass<MyEnum, IMyInterface> .

我该如何解决这个问题?

例如,这不编译:

var c = new MyContainer<MyEnum>();
c.MyProp = new SomeClass<MyEnum, MyImplementation>();

这是一个 dot net fiddle

最佳答案

您可以通过使泛型类型参数不变(协变或逆变,取决于其成员)来使其工作。但是,在 C# 中,您只能在接口(interface)上声明泛型参数不变,因此您必须声明另一个接口(interface):

public interface ISomeClass<TEnum, in S>
{

}

public class SomeClass<TEnum, S> : ISomeClass<TEnum, IMyInterface>
where TEnum : struct, IConvertible
where S : IMyInterface
{

}

public class MyContainer<TEnum> where TEnum : struct, IConvertible
{
public ISomeClass<TEnum, IMyInterface> MyProp { get; set; }
}

这将使以下代码编译:

var container = new MyContainer<DayOfWeek>();
container.MyProp = new SomeClass<DayOfWeek, MyImplementation>();

另一个可能的解决方案是使用另一个接口(interface),其中 S通用类型参数不存在:

public interface ISomeClass<TEnum>
where TEnum: struct, IConvertible
{

}

public class SomeClass<TEnum, S> : ISomeClass<TEnum>
where TEnum : struct, IConvertible
where S : IMyInterface
{

}

public class MyContainer<TEnum> where TEnum : struct, IConvertible
{
public ISomeClass<TEnum> MyProp { get; set; }
}

奖金 - 为什么它不起作用:

假设您的代码可以编译,并且您可以分配 MyClass<T>MyClass<IT>只要T工具 IT .你可以有以下类(class):

class MyClass<T>
{
public List<T> MyProp { get; set; }
}

然后做

MyClass<IMyInterface> instance = new MyClass<MyInterfaceImplementation>();

用那个instance.MyProp将是 List<MyInterfaceImplementation>但你可以访问它,就好像它是 List<IMyInterface>所以你可以尝试添加 MyOtherInterfaceImplementation 的元素这会在运行时崩溃。不好玩。

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

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