我刚刚注意到这也有效:
MessageBox.Show("number of things in the report are " + myHashSetVariable.Count);
我的印象是我应该使用 myHashSetVariable.Count.ToString()
它是 VS2010 中的某种编译器/解释器改进吗?我正在使用 VS2010 Pro
我刚刚注意到这也有效:
MessageBox.Show("number of things in the report are " + myHashSetVariable.Count);
我的印象是我应该使用 myHashSetVariable.Count.ToString()
它是 VS2010 中的某种编译器/解释器改进吗?我正在使用 VS2010 Pro
首先,这与MessageBox.Show
. 这与+
运营商有关。string + object 的结果等于一个字符串。
语言中的 + 运算符有许多重载(您也可以为用户定义的类型添加自己的重载)。只有两个以 aobject
作为参数,即operator+(string, object)
和operator+(object, string)
。在这两种情况下,操作符的实现主体都会调用ToString
参数object
,然后使用它string.Concat
来产生结果。
由于您的变量是一个整数,并且它使用operator+
withstring
作为第一个参数,因此它将operator+(string, object)
不匹配其他候选人。
ToString 被隐式调用以验证您可以省略消息中的字符串文字,现在您需要显式调用 ToString 以消除编译错误
MessageBox.Show(myHashSetVariable.Count); //This gives the error
你可以这样做:
int intval = 5;
string blah = "This is my string" + intval;
ToString()
在那里被隐式调用。不过,我发现显式调用它是有意义的,以使代码更清晰。
Servy 做对了。以下是一些链接和示例,可能有助于您进一步理解字符串连接和隐式转换的主题。
C# 语言规范第7.7.4 节加法运算符指出:
当一个或两个操作数都是字符串类型时,二元 + 运算符执行字符串连接。[...] 通过调用从类型 object 继承的虚拟 ToString 方法,将任何非字符串参数转换为其字符串表示形式。
对于 int 预定义类型的简单案例,您会看到根据规范调用int.ToString() 。但是如果你有一个用户定义的类型,你也可能会遇到到字符串的隐式转换( 6.4.3 用户定义的隐式转换中的血腥细节)。
要进行实验,请定义一个模仿 MessageBox.Show(string) 的方法。重要的是不要直接调用Console.WriteLine,因为它提供了大量的 Write 重载,包括 Write(Int32):
static void Write(string s)
{
Console.WriteLine(s);
}
还有一些用户定义的类:
首先,一个没有覆盖或转换的空类。
class EmptyClass {
}
还有一个覆盖 Object.ToString 的类。
class ToStringOnly {
public override string ToString() {
return "ToStringOnly";
}
}
另一个演示隐式转换为字符串的类:
class ImplicitConversion {
static public implicit operator string(ImplicitConversion b) {
return "Implicit";
}
}
最后,我想知道当一个类既定义隐式转换又覆盖 Object.ToString 时会发生什么:
class ImplicitConversionAndToString {
static public implicit operator string(ImplicitConversionAndToString b) {
return "Implicit";
}
public override string ToString() {
return "ToString";
}
}
隐式转换的测试:
// Simple string, okay
Write("JustAString"); // JustAString
// Error: cannot convert from 'int' to 'string'
//Write(2);
// EmptyClass cannot be converted to string implicitly,
// so we have to call ToString ourselves. In this case
// EmptyClass does not override ToString, so the base class
// Object.ToString is invoked
//Write(new EmptyClass()); // Error
Write(new EmptyClass().ToString()); // StackOverflowCSharp.Program+EmptyClass
// implicit conversion of a user-defined class to string
Write(new ImplicitConversion()); // Implicit
// while ToStringOnly overrides ToString, it cannot be
// implicitly converted to string, so we have to again
// call ToString ourselves. This time, however, ToStringOnly
// does override ToString, and we get the user-defined text
// instead of the type information provided by Object.ToString
//Write(new ToStringOnly()); // ERROR
Write(new ToStringOnly().ToString()); // "ToStringOnly"
而且,更相关的是对字符串连接的测试:
// Simple string
Write("string"); // "string"
// binary operator with int on the right
Write("x " + 2); // "x 2"
// binary operator with int on the left
Write(3 + " x"); // "3 x"
// per the specification, calls Object.ToString
Write("4 " + new EmptyClass()); // "4 StackOverflowCSharp.Program+EmptyClass"
// the implicit conversion has higher precedence than Object.ToString
Write("5 " + new ImplicitConversion()); // "5 Implicit"
// when no implicit conversion is present, ToString is called, which
// in this case is overridden by ToStringOnly
Write("6 " + new ToStringOnly()); // "6 ToStringOnly"
并用一个既定义隐式转换又覆盖 Object.ToString()的类来密封它:
// In both cases, the implicit conversion is chosen
Write( new ImplicitConversionAndToString() ); // "Implicit"
Write( "8: " + new ImplicitConversionAndToString()); // 8: Implicit