2016-06-13 4 views
1

어떻게 작동합니까?public static float [] operator/(float [] a, int b) 컴파일되지 않습니다.

intint을 일으키는 float으로 작동 암시 적으로 float (또는 double)으로 승진한다?

 public static float [ ] operator/(float [ ] a , int b) 
     { 
     float [ ] c = new float [ a . Count () ]; 
     for (int i = 0 ; i < a . Count () ; i++) 
      { 
      c[i] += a [ i ]/b; 
      } 
     return c; 
     } 

Error CS0563 One of the parameters of a binary operator must be the containing type

는 컴파일러 아니라 본체에, 오퍼레이터에 선언 (/)에 토하고된다.

+0

[Generics 및 "이진 연산자의 매개 변수 중 하나가 포함 된 형식이어야합니다"오류] (http://stackoverflow.com/questions/6891776/)의 중복 제네릭 - 중 - 하나 - 매개 변수 중 하나 - 이진 - 연산자 -해야 - 포함 - 포함); [MSDN here] (https://msdn.microsoft.com/en-us/library/zb1a95x1.aspx)도 참조하십시오. –

+1

전혀 도움이되지 않습니다 : 컴파일러 오류를 이끌어내는 방법을 보여줍니다. –

+1

잘못된 dup으로 오류가 발생했습니다. Keyu Gan이 지적했듯이 [이것은 문제와 해결책에 대한 더 나은 설명입니다] (https://stackoverflow.com/questions/1687395/overloading-the-operator-to-add-two-arrays). –

답변

4

연산자는 관련 클래스의 본문에 선언해야합니다. 이는 오버로드 된 연산자가 새로운 "/"함수가 속한 클래스 유형을 포함해야 함을 의미합니다.

그러나 배열 구현을위한 코드 공간은 없습니다 (내부화되어 있음). 따라서 C++과 달리 은 불가능합니다. 유형을 수정하지 않고도 목표를 달성 할 수 있습니다. 플로팅 어레이 (또는 목록)에서, 새로운 클래스 연산자를 정의 구현

  • 랩 완전히 새로운 클래스 :

    여기서 몇 가지 가능한 방법이다.

  • 연산자 대신 분리 된 함수를 작성하십시오.
  • Jordao의 답변이 here 인 고급 래퍼 클래스를 만드는 가장 좋은 방법은 배열의 선언 방법 만 수정하면됩니다.
1

당신이

class FloatArray 
{ 
    float[] arr; 
    public FloatArray(float[] arr) 
    { 
     this.arr = arr; 
    } 
    public static float[] operator /(FloatArray a, int[] b) 
    { 
     var res = new float[a.arr.Length]; 
     for (int i = 0; i < a.arr.Length; i++) 
     { 
      res[i] = a.arr[i]/b[i]; 
     } 
     return res; 
    } 
    public static implicit operator FloatArray(float[] arr) 
    { 
     return new FloatArray(arr); 
    } 
} 

사용처럼 뭔가 갈 수

 var floats = new float[] { 20f, 30f }; 
     var ints = new int[] { 10, 6 }; 
     var result = (FloatArray)floats/ints; 
+0

왜 성능이 좋지 않다고 생각하십니까? –

+0

@drdbkarron 메모리 복사 및 실행 선택 때문에. 나는 그 작업을 제거하기 위해 코드를 변경했습니다. 이제는 꽤 빠릅니다. – Tsayper

0

만약 내가 잘못 정정 해줘. 구현이 잘못되었다고 생각합니다. 수학 선언에서 빌드에 약간의 차이가 있습니다. float에 대한 int의 암시 적 프로모션.

공개가 위험한 경우 수업에서 비공개로 간주합니다.

나는 이것들과 가깝다. 주석 처리 된 코드 블록은 을 컴파일하지는 않습니다.

 public static Vertex operator/(Vertex a , Vertex b) 
      { 
      Vertex c = new Vertex (); 
      c . x = a . x/b . x; 
      c . y = a . y/b . y; 
      c . z = a . z/b . z; 
      return c; 
      } 
     public static Vertex operator/(Vertex a , float b) 
      { 
      Vertex c = new Vertex (); 
      c . x = a . x/b; 
      c . y = a . y/b; 
      c . z = a . z/b; 
      return c; 
      } 
     public static Vertex operator/(Vertex a , int b) 
      { 
      Vertex c = new Vertex (); 
      c . x = a . x/b; 
      c . y = a . y/b; 
      c . z = a . z/b; 
      return c; 
      } 
     public static Vertex operator + (Vertex a , Vertex b) 
      { 
      Vertex c = new Vertex (); 
      c . x = a . x + b . x; 
      c . y = a . y + b . y; 
      c . z = a . z + b . z; 
      return c; 
      } 
     public static implicit operator float[] (Vertex a) 
      { 
      float [ ] f = new float [ 3 ]; 
      f [ 0 ] = a . x; 
      f [ 1 ] = a . y; 
      f [ 3 ] = a . z; 
      return f; 
      } 


    //public dynamic float [ ] operator/(float[] a, int b) 
    // { 
    // float [ ] c = new float [ a . Count () ]; 
    // for (int i = 0 ; i < a . Count () ; i++) 
    //  { 
    //  c[i] += a [ i ]/b; 
    //  } 
    // return c; 
    // } 
    float [ ] NewCentroidf3 (Vertex v0 , Vertex v1) 
     { 
     float[] C = new float[3]; 

     C = v0 + v1; 
     //C /= 2.0f; 
     //C = C/2; // would work if above worked. 

     C [ 0 ] /= 2.0f; 
     C [ 1 ] /= 2.0f; 
     C [ 2 ] /= 2.0f; 
     return C; 
     } 

우리는 문제를 해결할 C 번호의 가상의 미래 버전으로 "확장 연산자를"추가 고려하고있다. 설문 조사 :이 기능에 대한 훌륭한 시나리오가 있습니까? 우리가 얻을 수있는보다 실제적인 시나리오 일수록, 언젠가 기능이 구현 될 가능성이 커집니다. 내 방식대로 보내라. 내 블로그에서 이메일 링크를 사용할 수 있습니다. # : 17694 Eric Lippert

+0

이 경우 "/"함수는 "Vertex/something' 또는'something/Vertex' 인"/ "함수가 있어야하는 C#의 제한입니다. . –

관련 문제