错误、漏洞、问题 - 页 2680

 
Koldun Zloy:

这一切也都在这里。

不对!

我专门在VS2019中检查过。

class A
    {
        private int f1() { return 1; }
        private int f2() { return 2; }
        public int  f(int v) { const int a = f1(); const int b = f2(); return (v + a + b); }
    }

错误 CS0133 分配给 "a "的表达式必须是常数。 ConsoleApp2 ...\repos\ConsoleApp2\ConsoleApp2\Program.cs 13 Active

错误 CS0133 分配给 "b "的表达式必须是常数。 ConsoleApp2 ...\repos\ConsoleApp2\ConsoleApp2\Program.cs 13 Active

 
Igor Makanu:

去年不是这样的--我专门测试了常量修改器

似乎@Ilyas 解释了如何运行一个MQL程序,首先所有的常量和静态都被初始化,不管它们在哪里被定义,然后调用类的构造函数。

好的,有了这个初始化的静态/常量--它仍然可以被正确地分发,但事实上,常量修改器并不能保证编译器会检查它--非常意外--我的第二个例子

在你的两个例子中,一切工作都是正确的,而且是预期的。

 
Koldun Zloy:

在你的两个例子中,一切工作都是正确的,而且是预期的。

预期的是,const修改器99%确保编译器在编译时能发现我的错误,VS2019会这样做,MQL不会这样做

 
Igor Makanu:

预期的const修改器是99%确保编译器会在编译时发现我的错误,VS2019会这样做,MQL不会这样做。

你到底认为什么是错误?

我在VS2019中没有得到任何错误。

 
Igor Makanu:

去年不是这样的--我专门测试了常量修改器

而且似乎@Ilyas 解释了如何运行MQL-程序,首先所有的常量和静态变量都被初始化,不管它们在哪里被描述,然后调用类构造器。

这似乎是带有const/static修改器的全局变量,而你使用的是局部变量。

 
Koldun Zloy:

你到底认为什么是错误?

我在VS2019中没有得到任何错误。

错误在于MQL编译器允许模棱两可的表达方式,如果有一个const修饰符,那么它就是一个常量。

同样的代码没有 被编译器追踪到? 另一种情况已被追踪到

VS2019中的夏普在编译前就发现了它。

class A{
public:
   int ivalue;
   int inc()const {static int v = 0; return(++v);}
   A():ivalue(0){}
};

class B{
public:
   int ivalue;
   int inc(){return(++ivalue);}
   B():ivalue(0){}
};

//+------------------------------------------------------------------+
void OnStart()
{
   const A a;
   Print(a.inc());  
   B b1;
   Print(b1.inc());
   const B b2;
   Print(b2.inc()); // 'inc' - call non-const method for constant object
}
//+------------------------------------------------------------------+
谢尔盖-迪尤布利 克。

你一定是指带有 const/static 修饰符的全局变量,而你使用的是局部变量。

我可能被搞糊涂了,但const修改器的行为与C#非常不同

 

一个用const修饰符声明的变量不能被改变。编译器会跟踪这一点。

你可能期望它做别的事情。

 
Koldun Zloy:

你可能期望从它那里得到不同的东西。

显然是的,我希望在MQL和C#之间跳转时是一样的。

 

2366号建筑

namespace X
{

class A
{
public:
   A(){}
};

}  //  namespace X

class B : public X::A
{
public:
   B() : X::A()  //'X' - struct member undefined
   {
   }
};
 
Ilyas:

谢谢你的帖子,我将检查

mq5 - 正常。mq4 - 破损。你可以从这里 获取TypeToBytes_ExampleScript.mq4。 只有当你把扩展名改为mq5时,它才能编译。

原因: