-2

我刚刚注意到这也有效:

MessageBox.Show("number of things in the report are  " + myHashSetVariable.Count);

我的印象是我应该使用 myHashSetVariable.Count.ToString()

它是 VS2010 中的某种编译器/解释器改进吗?我正在使用 VS2010 Pro

4

4 回答 4

5

首先,这与MessageBox.Show. 这与+运营商有关。string + object 的结果等于一个字符串。

语言中的 + 运算符有许多重载(您也可以为用户定义的类型添加自己的重载)。只有两个以 aobject作为参数,即operator+(string, object)operator+(object, string)。在这两种情况下,操作符的实现主体都会调用ToString参数object,然后使用它string.Concat来产生结果。

由于您的变量是一个整数,并且它使用operator+withstring作为第一个参数,因此它将operator+(string, object)不匹配其他候选人。

于 2012-09-18T17:36:31.290 回答
2

ToString 被隐式调用以验证您可以省略消息中的字符串文字,现在您需要显式调用 ToString 以消除编译错误

MessageBox.Show(myHashSetVariable.Count); //This gives the error
于 2012-09-18T17:36:21.880 回答
1

你可以这样做:

int intval = 5;
string blah = "This is my string" + intval;

ToString()在那里被隐式调用。不过,我发现显式调用它是有意义的,以使代码更清晰。

于 2012-09-18T17:36:55.517 回答
1

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
于 2012-09-18T19:22:20.793 回答