gpt4 book ai didi

c# - 无法将 MyType 转换为 MyType
转载 作者:行者123 更新时间:2023-11-30 19:46:02 27 4
gpt4 key购买 nike

我得到的具体异常是:

Unable to cast object of type NbtByte to type INbtTag<System.Object>

在这一行:

tag = (INbtTag<object>)new NbtByte(stream);

在哪里tag声明为:

INbtTag<object> tag;

NbtByte定义为:

public class NbtByte : INbtTag<byte>

在哪里IBtTag是:

public interface INbtTag<out T>

我认为将其声明为 out T我将能够做这样的事情。

基本上,我想要一本 IbtTag<T> 的字典小号,

var dict = new Dictionary<string, INbtTag<object>>();

但是在哪里 T是不同的类型(因此我用 object 声明了它)。这可能吗?

最佳答案

接口(interface)差异仅适用于引用类型。值类型(如整数、字节等,以及自定义结构)被排除在外。例如,您不能将整数数组用作 IEnumerable<object>即使数组是 IEnumerable<int> .

IEnumerable<object> objs = new int[] { 1, 2, 3 }; // illegal
IEnumerable<object> objs = new string[] { "a", "b", "c" }; // legal

要解决您的字典问题,您或许可以选择定义一个非通用接口(interface)。 (在您的通用接口(interface)可能将成员公开为类型 T 的情况下,非通用接口(interface)将简单地公开 object。)

说你有

interface INbtTag { } // non-generic interface 
interface INbtTag<out T> : INbtTag { } // covariant generic interface

然后您可以将字典用作 Dictionary<string, INbtTag> .

缺点是当您实现接口(interface)时,您必须两者。这通常意味着隐式实现通用版本,显式实现非通用版本。例如:

interface INbtTag
{
object GetValue();
}

interface INbtTag<out T> : INbtTag
{
T GetValue();
}

class NbtByte : INbtTag<byte>
{
byte value;

public byte GetValue() // implicit implementation of generic interface
{
return value;
}

object INbtTag.GetValue() // explicit implementation of non-generic interface
{
return this.GetValue(); // delegates to method above
}
}

关于c# - 无法将 MyType<T> 转换为 MyType<object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338604/

27 4 0