2015-05-18 73 views
-1

好吧我对此很陌生,我有一个简单的问题。我有一个类不能将类型ConsoleSandbox.StudentName隐式转换为int

public class StudentName 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int ID { get; set; } 
} 

,并在主方法我试着打电话是这样的:

public class Program 
{ 
    public static void Main() 
    { 
     int number = 123; 
     var result = number; 

     if (number.Equals(123)) 
     { 
      result = new StudentName 
      { 
       FirstName = "Jurand", 
       LastName = "Kowalsky", 
       ID = 183 
      }; 
     } 

     System.Console.WriteLine(result); 
     Console.ReadLine(); 
    } 
} 

我不分配对象到另一个变种的原因是,有时我有采取不同的方法重载不同的参数。

有没有办法将int转换为对象?或者有什么办法可以做到这一点?

+0

你总是可以找到一种方法来拍摄自己的脚。你为什么想做出这样一件愚蠢的事情?整数和对象引用有很多不同之处。保持安全并使用适当的变量。 – Steve

回答

5

这两条线

int number = 123; 
var result = number; 

告诉编译器resultint类型。在编译时间处设置为

此行

result = new StudentName 

试图分配一个StudentName导致。这是行不通的,因为它已经有int的类型。

虽然您可以第一通过改变其类型为对象

object result = number; 

的坏程序设计的气味分配的整数,并且然后一个StudentName到相同的变量。

注意,这条线

System.Console.WriteLine(result); 

会如果result工作仍然是一个整数。如果您将其更改为对象,则只会打印出System.Object(或类似的东西)。如果最终改变程序设计以便使用StudentName类型,则可以在该类中重写ToString()以提供有意义的输出,例如

public class StudentName 
{ 
    /* Rest of the class here */ 
    public override ToString() 
    { 
     return FirstName + " " + LastName + " ID: " + ID; 
    } 
} 

我不分配对象到另一个变种的原因是,有时我有采取不同的参数不同的方法重载。

我不完全确定你要完成什么,但看看C# Generics。它们允许您编写一次可用于各种类型的代码,然后指定使用泛型类的确切类型。

2

更改var result = number;object result = number;

使用var并不意味着您可以在运行时切换变量的类型,它只是意味着编译器在编译时确定变量的类型。由于您已将int分配给结果,因此它将结果输入为int。当您尝试将StudentName分配给该变量时,它会抛出异常,因为它无法将StudentName转换为int

由于所有对象都从object继承,因此使用result对象类型应解决问题。

+2

虽然技术上你是对的,但我认为你不会在OP的帮助下建议使用'object'作为已知类型。如果他想将盒装的“int”与另一个“int”进行比较呢? –

+0

我认为你说得对,但是,我不知道OP正在努力完成什么。我只是试图回答他提供的有限信息的实际问题。 –

1

尽管var不再需要用类型声明变量,但编译器仍然会为其指定一个类型。您不能为任何不同类型重用任何变量。

我不明白你的论点,即不同的方法重载阻止你使用不同的变量。为不同的事情重用变量会让你的代码非常难读。

0

我同意其他人:将var更改为您真正想要使用的类型。这就是你最好学习了解类型的方法。

var是新.NET版本中的一些新功能所必需的 - 但首先您应该了解基本知识。

变种可以与很长的类名,当你只是初始化一个对象,一旦有用:

BufferedFileInputStream myStream = new BufferedFileInputStream; 

var myStream = new BufferedFileInputStream; 

这仅仅是为了更好的阅读的快捷方式。你不应该使用myStream做其他事情。如果你这样做,这是一种代码味道。

相关问题