为什么C++ 0x不支持用户定义类型即对象的隐式转换?是否有任何项目实际使用此(错误)功能?每当我在代码中看到单个参数构造函数时,我就会进行检查或修改,我将其视为bug并使其明确.到目前为止,它运作良好,没有人抱怨.
谢谢.
编辑:让我引用STL的创建者Alex Stepanov:
打开您的C++书籍并阅读有关显式关键字的内容!请求您的邻居C++标准委员会成员最终取消隐含的转换.有一个常见的误解,通常由应该更清楚的人传播,STL依赖于隐含的转换.不是这样!
再次编辑:不,没有辩论.我只是好奇是否有人在他们的工作中使用隐式转换.我从未见过任何允许隐式转换对象的项目.我认真思考并且没有任何假设的场景,隐式转换不会成为雷区.我的意思是C++单个参数转换,而不是从C继承的float-> double或类似转换
我想让以下代码工作:
Mylist lst;
vector<int> v = lst;
Run Code Online (Sandbox Code Playgroud)
所以我看到我需要将列表转换为矢量.我试过这段代码:
vector<int> operator=(vector<int> v, const List & l) {
return v; // more profound stuff later :-)
}
Run Code Online (Sandbox Code Playgroud)
(把它放在课外).不幸的是Visual Studio抛出了我:"错误:'operator ='必须是成员函数".我不明白 - 我该怎么办?我不能把这个功能放在矢量类中......你可以帮帮我吗?谢谢!
c++ operator-overloading assignment-operator implicit-conversion operator-keyword
我有一个字符串类的自定义实现.我在字符串和类之间添加了自定义转换运算符,并且转换正常.但是,如果我首先将自定义对象转换为System.Object然后转换为字符串,则说:"无法将类型'MyString'强制转换为'System.String'".这是为什么?我怎样才能启用它...
class MyString
{
public string S {get; set;}
public MyString(string s)
{
this.S = s;
}
public static implicit operator string(MyString s)
{
return s.S;
}
public static implicit operator MyString(string s)
{
return new MyString(s);
}
}
class Program
{
static void Main(string[] args)
{
MyString ms = new MyString("a");
string s = ms;
object o = ms;
string s1 = (string)o; // <-- this throws the exception!
}
}
Run Code Online (Sandbox Code Playgroud) 当我尝试执行这个belo代码时,我收到了这个错误.
//码:
int Value = Convert.ToInt32(Request.QueryString["Value"] == null ? 0 : Request.QueryString["Value"]);
Run Code Online (Sandbox Code Playgroud)
所以如果QueryString值为null,我需要传递值'0' .
我怎么解决这个问题?
我对C#很新,所以我希望如果我的问题听起来很愚蠢请原谅我的无知.
-我尝试Inheritance用丰达C#,发现它在一些奇怪的行为方式,所以我想用检查出来Java,我得到了我的预期的结果.
-我只是想知道这里有什么我想念的.......
C#代码:
class Animal
{
public void Sound()
{
System.Console.WriteLine("I don't make any sound");
}
}
class Dog : Animal
{
public void Sound()
{
System.Console.WriteLine("barking");
}
}
class InheritTest
{
static void Main()
{
Animal a = new Dog(); // Implicit conversion
Dog d = (Dog) a; // Explicit conversion
a.Sound();
d.Sound();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
I don't make any sound
barking
Run Code Online (Sandbox Code Playgroud)
JAVA代码:
class Animal
{
public void sound()
{ …Run Code Online (Sandbox Code Playgroud) 我一直在尝试隐式转换,而且我对使用这些转换的'enrich-my-libray'模式有了很好的理解.我试图将我对基本隐含的理解与隐含证据的使用结合起来......但我误解了一些关键的东西,如下面的方法所示:
import scala.language.implicitConversions
object Moo extends App {
case class FooInt(i: Int)
implicit def cvtInt(i: Int) : FooInt = FooInt(i)
implicit def cvtFoo(f: FooInt) : Int = f.i
class Pair[T, S](var first: T, var second: S) {
def swap(implicit ev: T =:= S, ev2: S =:= T) {
val temp = first
first = second
second = temp
}
def dump() = {
println("first is " + first)
println("second is " + second)
}
}
val x = new Pair(FooInt(200), …Run Code Online (Sandbox Code Playgroud) 我想在向数据库添加新消息后获得状态.我定义了一个枚举(类型int),但是当我调用时,该方法给了我2条错误消息return await db.SaveChangesAsync();
无法将类型'xxx.Models.MessageStatus'隐式转换为'int'.
和
无法将类型'int'隐式转换为'xxx.Models.MessageStatus'.
我的测试代码:
enum MessageStatus
{
Success,
Failure
}
private async Task<MessageStatus> AddMessage()
{
using (var db = new VinaChanelDbContext())
{
try
{
//do stuff...
await db.SaveChangesAsync();
return MessageStatus.Success; /* or return 0; */
}
catch { return 1; /* or return MessageStatus.Failure; */ }
}
}
Run Code Online (Sandbox Code Playgroud)
MSDN doc说:
SaveChangesAsync()将返回
Task<int>
所以,我的问题是:为什么AddMessage方法不接受
/* implicit conversion to MessageStatus.Success or MessageStatus.Failure */
return await db.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud) 在C#中,我有一个类:
public class Person
{
public string name;
public int id;
}
Run Code Online (Sandbox Code Playgroud)
目前,当我这样做时:
Person person = new Person
{
name = "John",
id = 3
}
// Will be converted Console.Writeline("Person = " + person.ToString()); by the compiler
Console.Writeline("Person = " + person);
Run Code Online (Sandbox Code Playgroud)
我可以在类中做什么来使从人到人的自动转换无效.ToString()并使编译器给出一个错误来指示Person对象不能隐式转换为字符串?
我正在学习C#并遇到一些让我对它的语法感到不舒服的事情.
情况1
byte num1 = 10; // works
int ten = 10;
byte num2 = ten; // Compile error: Cannot implicitly convert 'int' to byte. An explicit conversion exists.
Run Code Online (Sandbox Code Playgroud)
在第一个语句中,编译器隐式地将文字10(类型为int)强制转换为byte,相反,它在第三个语句中不执行相同操作.
案例2
int[] numbers1 = { 10, 20, 30 }; // works
int[] numbers2;
numbers2 = { 10, 20, 30 }; // Compiler error: Invalid expression term: {
Run Code Online (Sandbox Code Playgroud)
上面缩短的数组初始化程序在每个语句中都不起作用.
而且可能还有更多这样的不一致......
似乎错误版本是正确的,因为它们是按照定义的语法,非错误版本(对于类似的情况)是语言创建的构造,只是使语言易于编码.
但是在我们使用它的每个地方仍然不一致吗?
默认情况下,Java假定您使用文字定义int值.
short x = 20; // There is an implicit conversion
Run Code Online (Sandbox Code Playgroud)
但是当我们在算术表达式中使用"x"变量时,例如:
short y = x * 2; //DOES NOT COMPILE
Run Code Online (Sandbox Code Playgroud)
我们知道20*2的结果是40,可以很容易地拟合成一个短变量.到底是怎么回事?