gpt4 book ai didi

C# 显式运算符和对象

转载 作者:太空狗 更新时间:2023-10-29 18:07:23 24 4
gpt4 key购买 nike

问题

请先看一下代码。

这是我的自定义类:

public class float2D
{
public float X { get; private set; }
public float Y { get; private set; }

public float2D(float x, float y)
{
this.X = x;
this.Y = y;
}

public static explicit operator Point(float2D x)
{
return new Point((int)x.X, (int)x.Y);
}

...
}

这是我写的测试代码:

    private void TEST()
{
float2D V = new float2D(1, 1);
Point P = Point.Empty;
P = (Point)V; // Works
P = (Point)(V as object); // Specified cast is not valid.
}

如您所见,当值类型未知时,它无法转换值。我相信发生这种情况是因为它在 Object 类中搜索不是真实类型的操作数。我该如何解决这个问题?

我有一个代码,其中一切都是对象,它必须处理这些对话。

如果你有任何想法,请告诉我。


避免动态

好吧,让我们以您可以看到我到底想做什么以及我的情况如何的方式更改示例。

这是我的类(class):

    class TEST
{
dynamic OBJECT;
public void STORE<T>(ref T V)
{
this.OBJECT = V;
}

public T CONVERT<T>()
{
return (T)this.OBJECT;
}
}

下面是测试代码:

        float2D V = new float2D(1, 1);
TEST t = new TEST();
t.STORE(ref V);
Point P = t.CONVERT<Point>();

有什么办法可以从上面的类中删除动态并保持它的工作?我真的很想避免使用 .Net4/4.5

最佳答案

是的,这是两个截然不同的东西。第一行:

P = (Point)V; // Works

使用显式转换运算符,该运算符针对此组合重载。然而,第二个:

P = (Point)(V as object); // Specified cast is not valid.

这会将引用 V 转换为 object(我们通常知道它是)- 然后从 object separately 转换

由于 Point 是一个 struct,因此它会尝试“拆箱”相同的引用,就好像它是一个装箱的 Point 一样。但它不是一个装箱的,所以错误是正确的。转换运算符不是多态的,只有当盒子包含适当类型的装箱副本时才允许拆箱(注意:您可以将枚举拆箱为整数,并将整数拆箱为枚举 - 只要底层类型匹配)。

然而,即使 Point 是一个 class,它仍然会失败并出现类似的错误:如果类型不兼容,引用保留转换也不起作用。

关于C# 显式运算符和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635103/

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