gpt4 book ai didi

C#:运行时数据类型转换

转载 作者:太空狗 更新时间:2023-10-29 21:51:48 24 4
gpt4 key购买 nike

这是我第一次自己使用 StackOverflow。我以前在这里找到了很多问题的答案,所以我想我会尝试自己问一些问题。

我正在做一个小项目,现在有点卡住了。我知道解决问题的方法 - 只是不是我想要的解决方式。

该项目包括一个我决定自己编写的 NBT 解析器,因为它将或多或少地用于 NBT 文件的自定义变体,尽管核心原则是相同的:带有预定义“关键字”的二进制数据流对于特定种类的标签。我决定尝试只为所有不同类型的标签制作一个类,因为标签的结构非常相似——它们都包含一个类型和一个有效负载。这就是我被困的地方。我希望有效载荷具有特定类型,当隐式完成显式转换时,该类型会引发错误。

我能想到的最好办法是将有效负载设为 Object 或动态类型,但这将允许隐式完成所有转换:

Int64 L = 90000;
Int16 S = 90;
dynamic Payload; // Whatever is assigned to this next will be accepted
Payload = L; // This fine
Payload = S; // Still fine, a short can be implicitly converted to a long
Payload = "test"; // I want it to throw an exception here because the value assigned to Payload cannot be implicitly cast to Int64 (explicit casting is ok)

有什么办法吗?我想通过以某种方式告诉 C# 从现在开始,即使 Payload 是动态的,如果无法将分配的值隐式转换为当前值的类型,它也会抛出异常 - 当然,除非它已完成明确地。

我愿意接受其他方式来实现这一点,但我想避免这样的事情:

public dynamic Payload
{
set
{
if(value is ... && Payload is ...) { // Using value.GetType() and Payload.GetType() doesn't make any difference for me, it's still ugly
... // this is ok
} else if(...) {
... // this is not ok, throw an exception
}
... ... ...
}
}

最佳答案

您是否考虑过使用泛型?这会自动为您提供编译时检查允许哪些转换。

class GenericTag<T>
{
public GenericTag(T payload)
{
this.Payload = payload;
}

public T Payload { set; get; }
}

// OK: no conversion required.
var tag2 = new GenericTag<Int64>(Int64.MaxValue);

// OK: implicit conversion takes place.
var tag1 = new GenericTag<Int64>(Int32.MaxValue);

// Compile error: cannot convert from long to int.
var tag4 = new GenericTag<Int32>(Int64.MaxValue);

// Compile error: cannot convert from string to long.
var tag3 = new GenericTag<Int64>("foo");

关于C#:运行时数据类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893173/

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