【问题标题】:Can't cast int to T, where T is bool. Is there a way to do this with C#?不能将 int 转换为 T,其中 T 是 bool。有没有办法用 C# 做到这一点?
【发布时间】:2011-06-01 16:48:48
【问题描述】:

我会尽量快,因为我已经对这个主题进行了详尽的搜索,我只找到与将 bool 转换为 int 相关的主题。

我建立了一个类来处理稀疏矩阵。它们可以用 double、int 或 bool 或任何其他值类型填充。

在位置 i,j 处获取一些矩阵元素:

public T getElementValueAt(int i, int j)
{
    int ind = this.doesElemExist(i, j); 
         // returns the element index if it exists, or -1
    return (ind == -1 ? (T)(object)0 : this.elem[ind].value );
}

在继续之前,重点介绍一下上面的不良做法,以及其他关于稀疏矩阵的内容:

  1. 我一直在搜索,发现(T)(object)0不是一个好习惯,但我不明白为什么我不能在这里使用它,因为无论T是int还是double都可以;

  2. 如果我要获取的元素不在列表this.elem上,我应该按照其他元素类型正确返回0。

所以归结为将一个 int 值(在本例中为 0)转换为某个类型 T,这是一个类型参数。

有什么好的方法吗?有没有关于这种方法的cmets?

任何帮助将不胜感激!

提前致谢!

【问题讨论】:

  • elem[ind].value 是什么类型,不是T 类型有什么原因吗?
  • 我想你会想要default(T)而不是(T)(object)0
  • 属性值已经是T类型了

标签: c# int casting boolean


【解决方案1】:

如果Tdouble,您的(T)(object)0 演员表将不起作用...当它试图将已装箱的int 拆箱到@ 时,它会抛出InvalidCastException 987654326@.

我怀疑你实际上想要的是default(T),它给出了T 的默认值——所以对于引用类型为空,对于数字类型等为零:

return ind == -1 ? default(T) : this.elem[ind].value;

作为旁注,我鼓励您尝试坚持 .NET 命名约定,包括方法的 PascalCase。

其他三个选项:

  • 按照其他答案中的建议使用Nullable<T>
  • 按照TryXXX的方法返回一个布尔值来指示是否找到了元素,并有一个out参数来接收值本身
  • 使用TryXXX 模式的修改版本,您可以在其中返回Tuple<bool, T>,而不是使用out 参数

【讨论】:

  • 在哪里可以找到命名约定?
【解决方案2】:

您可以使用默认值(T)。但是您也应该考虑使用可为空的类型。 (函数应该返回 T? where T : struct)。

【讨论】:

  • 将“where T : struct”添加到您的班级。让你的函数返回 T?。然后,如果元素不存在,则可以返回 null。
【解决方案3】:

使用下一个:

Convert.ToBoolean(int);

【讨论】:

  • 这不是我想要的,因为我想将“0”转换为类型参数 T,它恰好是 bool 或 int 或 double
【解决方案4】:

您是否考虑过返回 default(T) 而不是 0?

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 2012-03-08
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多