【问题标题】:Why can't I make an object = bool in C#?为什么我不能在 C# 中创建 object = bool?
【发布时间】:2013-03-30 21:13:20
【问题描述】:

我有一个程序,我正在尝试扩展对象类以允许引用数组所有成员的方法。

ExtendedArray 类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleMaze
{
    class ExtendedArray : Object
    {
        private object[] referredTo;

        public ExtendedArray()
        {
            referredTo = null;
        }//empty constructor

        public ExtendedArray(Object[] obj)
        {
            referredTo = obj;
        }//full constructor

        public void referToAll(object changeTo)
        {
            for (int x = 0; x < referredTo.Length; x++)
            {
                referredTo[x] = changeTo;
            }

        }//referToAll(bool)

    }//ExtendedArray <== class
}

我打算在未来使用这个类并添加一些东西,所以它非常通用。虽然当我尝试使用构造函数时出错,但无法将类型 bool[] 隐式转换为类型 object[]。

Boolean[] dirBoolArray = { curLeft, curUp, curRight, curDown };
ExtendedArray dirBool = new ExtendedArray(dirBoolArray);

【问题讨论】:

  • 您可以将可为空的bool? 转换为对象。
  • 目前尚不清楚您要在这里完成什么。您的扩展阵列的预期用途是什么?和List&lt;T&gt;有什么区别?
  • 谷歌拳击布尔 c#
  • 除了解释之外,您几乎肯定需要在这里使用泛型来解决问题,以便您可以接受T 的数组,而不是对象的数组。
  • 顺便说一句,不需要从Object 显式继承。无论如何,所有类都继承自它。

标签: c# arrays object boolean


【解决方案1】:

与您在标题中所说的相反,您可以将bool 分配给object 变量。以下代码编译正常:

bool b = true;
object o = b;

第二行实际上做了boxesbool 值,它将它从值类型转换为引用类型。

这意味着b 是一个直接包含 true 的单字节。另一方面,o 是一个引用(4 或 8 个字节),它指向一个对象,该对象包含一个具有 true 值的字节以及一些元数据。

您不能将bool[] 分配给object[] 类型的变量。这是因为bool[] 直接为每个bool 包含一个字节,而object[] 为每个项目包含一个引用

bool[] 转换为object[] 将是一个很大的变化:每个bool 都必须单独装箱,并且必须为对这些框的引用分配一个新数组。因此,编译器不允许您直接这样做。

您可以做的就是从一开始就创建object[]

object[] dirBoolArray = { curLeft, curUp, curRight, curDown };
ExtendedArray dirBool = new ExtendedArray(dirBoolArray);

这将创建一个装箱的bools 数组,这正是您所需要的。

还有一些注意事项:

  • 由于您使用的是Boolean,也许您预计boolBoolean 之间存在一些差异(就像在Java 中一样)。在 C# 中两者没有区别,bool 只是Boolean 的别名。

  • 使用object[] 是一种代码异味,这表明您可能做错了什么。它肯定不是 C# 中通常理解的词的“通用”方式。

【讨论】:

  • 您的意见对 svick 非常有用。谢谢。
【解决方案2】:

数组协方差仅在成员可以在不改变其表示的情况下进行转换时才有效(加上一些其他限制)。

这意味着您可以将引用类型的数组转换为object[],但不能将包含值类型的数组转换为object[]。从bool 转换为object 不会保留表示,因此无法将bool[] 转换为object[]

【讨论】:

  • 我怀疑 OP 知道什么是协方差。
【解决方案3】:

你为什么不能这样做:

class ExtendedArray<T> 
{
    private T[] referredTo;

    public ExtendedArray()
    {
        referredTo=null;
    }//empty constructor

    public ExtendedArray(T[] obj)
    {
        referredTo=obj;
    }//full constructor

    public void referToAll(T changeTo)
    {
        for(int x=0; x<referredTo.Length; x++)
        {
            referredTo[x]=changeTo;
        }

    }//referToAll(bool)

}//ExtendedArray <== class

class Program
{
    static void Main(string[] args)
    {
        ExtendedArray<bool> array=new ExtendedArray<bool>(new bool[10]);
        array.referToAll(true);
    }
}

【讨论】:

  • 他的类型的重点似乎是故意删除类型安全,除非这只是一个意外的副作用。这与仅使用常规数组相比没有任何优势。
  • 我认为你只是在猜测。让我们看看 OP 怎么说。
  • @Servy 我试图让它接受任何类型的数组。注意:虽然我有使用 Basic 和 Java 的经验,但我是一个相对较新的 C# 程序员。我也不知道T[] 是什么意思,也不知道&lt;bool&gt; 语法是什么意思。
  • 没关系,我去查了一下。现在一切都说得通了,谢谢。
猜你喜欢
  • 2017-05-05
  • 2011-01-11
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2015-04-25
  • 1970-01-01
相关资源
最近更新 更多