C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: C#のインターフェイスの実装についてです


(過去ログ 130 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■76866 / inTopicNo.1)  C#のインターフェイスの実装についてです
  
□投稿者/ EDF (17回)-(2015/08/24(Mon) 21:01:24)

分類:[.NET 全般] 

度々質問させて頂いています。今回もよろしくお願いします
using System;
using System.Linq;

/// <summary>
/// 2次元上の点。
/// <see cref="IComparable{T}"/> を実装している = 順序をつけられる。
/// </summary>
class Point2D : IComparable<Point2D>
{
    public double X { get; }
    public double Y { get; }

    public Point2D(double x, double y)
    {
        X = x;
        Y = y;
    }

    public double Radius => Math.Sqrt(X * X + Y * Y);
    public double Angle => Math.Atan2(Y, X);

    /// <summary>
    /// 距離で順序を決める。
    /// 距離が全く同じなら偏角で順序付け。
    /// </summary>
    /// <param name="other"></param>
    /// <returns></returns>
    public int CompareTo(Point2D other)
    {
        var r = Radius.CompareTo(other.Radius);
        if (r != 0) return r;
        return Angle.CompareTo(other.Angle);
    }
}


class IComparableSample
{
    public static void Main()
    {
        const int N = 5;
        var rand = new Random();
        var data = Enumerable.Range(0, N).Select(_ => new Point2D(rand.NextDouble(), rand.NextDouble())).ToArray();

        Console.WriteLine("元:");
        foreach (var p in data) WriteLine(p);

        // 並べ替えの順序に使える
        Console.WriteLine("整列済み:");
        foreach (var p in data.OrderBy(x => x)) WriteLine(p);
    }

    private static void WriteLine(Point2D p)
    {
        Console.WriteLine($"({p.X:N3}, {p.Y:N3}), radius = {p.Radius:N3}, angle = {p.Angle:N3}");
    }
}

ソースコードはここから
http://ufcpp.net/study/csharp/oo_interface.html?p=2

このコードをそのままコピーペーストしたところ
エラーが三十個くらいでてきました。原因を教えてください

引用返信 編集キー/
■76871 / inTopicNo.2)  Re[1]: C#のインターフェイスの実装についてです
□投稿者/ Hongliang (334回)-(2015/08/24(Mon) 22:12:33)
VS2015向けのコードっぽいですが、開発環境は何をご利用されていますか?
引用返信 編集キー/
■76875 / inTopicNo.3)  Re[1]: C#のインターフェイスの実装についてです
□投稿者/ 魔界の仮面弁士 (460回)-(2015/08/25(Tue) 09:58:55)
No76866 (EDF さん) に返信
> このコードをそのままコピーペーストしたところ
> エラーが三十個くらいでてきました。原因を教えてください

どの箇所で何ていうエラーになったのかぐらいは書きましょうよ…。(^_^;

まず提示のコードは、C# 6.0 以降に対応したコンパイラが必要です。
具体的には、Visual Studio 2015 ですね。


開発環境が分からないので、それより下位のバージョンを使っているものと
想像しますが、手元の環境で試してみたところでは:

Visual Studio 2013 => エラー:13、警告:0
Visual Studio 2012 => エラー:13、警告:0
Visual Studio 2010 => エラー:28、警告:0
Visual Studio 2008 => エラー:18、警告:0
Visual Studio 2005 => エラー:26、警告:0

となりました。約30個ということは、Visual Studio 2010 をお使いでしょうか。


とりあえず、VS2010 世代のコードに書き換えてみました。


using System;
using System.Linq;

/// <summary>
/// 2次元上の点。
/// <see cref="IComparable{T}"/> を実装している = 順序をつけられる。
/// </summary>
class Point2D : IComparable<Point2D>
{
  public double X { get; private set; }
  public double Y { get; private set; }

  public Point2D(double x, double y)
  {
    this.X = x;
    this.Y = y;
  }

  public double Radius { get { return Math.Sqrt(X * X + Y * Y); } }
  public double Angle { get { return Math.Atan2(Y, X); } }

  /// <summary>
  /// 距離で順序を決める。
  /// 距離が全く同じなら偏角で順序付け。
  /// </summary>
  /// <param name="other"></param>
  /// <returns></returns>
  public int CompareTo(Point2D other)
  {
    var r = Radius.CompareTo(other.Radius);
    if (r != 0) return r;
    return Angle.CompareTo(other.Angle);
  }
}


class IComparableSample
{
  public static void Main()
  {
    const int N = 5;
    var rand = new Random();
    var data = Enumerable.Range(0, N).Select(_ => new Point2D(rand.NextDouble(), rand.NextDouble())).ToArray();

    Console.WriteLine("元:");
    foreach (var p in data) WriteLine(p);

    // 並べ替えの順序に使える
    Console.WriteLine("整列済み:");
    foreach (var p in data.OrderBy(x => x)) WriteLine(p);
  }

  private static void WriteLine(Point2D p)
  {
    Console.WriteLine("({0:N3}, {1:N3}), radius = {2:N3}, angle = {3:N3}", p.X, p.Y, p.Radius, p.Angle);
  }
}
引用返信 編集キー/
■76877 / inTopicNo.4)  Re[2]: C#のインターフェイスの実装についてです
□投稿者/ 魔界の仮面弁士 (462回)-(2015/08/25(Tue) 10:09:07)
No76875 (魔界の仮面弁士) に追記
> とりあえず、VS2010 世代のコードに書き換えてみました。

続いて、VS2005 世代のコード。

using System;

/// <summary>
/// 2次元上の点。
/// <see cref="IComparable{T}"/> を実装している = 順序をつけられる。
/// </summary>
class Point2D : IComparable<Point2D>
{
  private double x, y;
  public double X { get { return x; } }
  public double Y { get { return y; } }

  public Point2D(double x, double y)
  {
    this.x = x;
    this.y = y;
  }

  public double Radius { get { return Math.Sqrt(X * X + Y * Y); } }
  public double Angle { get { return Math.Atan2(Y, X); } }

  /// <summary>
  /// 距離で順序を決める。
  /// 距離が全く同じなら偏角で順序付け。
  /// </summary>
  /// <param name="other"></param>
  /// <returns></returns>
  public int CompareTo(Point2D other)
  {
    int r = Radius.CompareTo(other.Radius);
    if (r != 0) return r;
    return Angle.CompareTo(other.Angle);
  }
}


class IComparableSample
{
  public static void Main()
  {
    const int N = 5;
    Random rand = new Random();
    Point2D[] data = new Point2D[N];
    for (int i = 0; i < N; i++)
    {
      data[i] = new Point2D(rand.NextDouble(), rand.NextDouble());
    }

    Console.WriteLine("元:");
    Array.ForEach(data, WriteLine);
    
    // 並べ替えの順序に使える
    Console.WriteLine("整列済み:");
    Array.Sort(data);
    Array.ForEach(data, WriteLine);
  }

  private static void WriteLine(Point2D p)
  {
    Console.WriteLine("({0:N3}, {1:N3}), radius = {2:N3}, angle = {3:N3}", p.X, p.Y, p.Radius, p.Angle);
  }
}
引用返信 編集キー/
■76879 / inTopicNo.5)  Re[3]: C#のインターフェイスの実装についてです
□投稿者/ 魔界の仮面弁士 (463回)-(2015/08/25(Tue) 11:51:15)
No76877 (魔界の仮面弁士) に追記
> ■No76875 (魔界の仮面弁士) に追記
>>とりあえず、VS2010 世代のコードに書き換えてみました。
> 続いて、VS2005 世代のコード。

ついでに、ジェネリックも取っ払ってみました。

ここまで戻せば、たとえ .NET 1.x 世代の C# コンパイラや、
/langversion:ISO-1 指定であっても通るはず…。


using System;

// 2次元上の点。
class Point2D : IComparable
{
  private double x, y;
  public double X { get { return x; } }
  public double Y { get { return y; } }

  public Point2D(double x, double y)
  {
    this.x = x;
    this.y = y;
  }

  public double Radius { get { return Math.Sqrt(X * X + Y * Y); } }
  public double Angle { get { return Math.Atan2(Y, X); } }

  // 距離で順序を決める。
  // 距離が全く同じなら偏角で順序付け。
  public int CompareTo(object obj)
  {
    Point2D other = (Point2D)obj;
    int r = Radius.CompareTo(other.Radius);
    if (r != 0) return r;
    return Angle.CompareTo(other.Angle);
  }
}


class IComparableSample
{
  public static void Main()
  {
    const int N = 5;
    Random rand = new Random();
    Point2D[] data = new Point2D[N];
    for (int i = 0; i < N; i++)
    {
      data[i] = new Point2D(rand.NextDouble(), rand.NextDouble());
    }

    Console.WriteLine("元:");
    foreach (Point2D p in data) WriteLine(p);
    
    // 並べ替えの順序に使える
    Console.WriteLine("整列済み:");
    Array.Sort(data);
    foreach (Point2D p in data) WriteLine(p);
  }

  private static void WriteLine(Point2D p)
  {
    Console.WriteLine("({0:N3}, {1:N3}), radius = {2:N3}, angle = {3:N3}", p.X, p.Y, p.Radius, p.Angle);
  }
}
引用返信 編集キー/
■76890 / inTopicNo.6)  Re[4]: C#のインターフェイスの実装についてです
□投稿者/ EDF (18回)-(2015/08/26(Wed) 12:23:39)
No76879 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士 さん いつも丁寧に教えてくださって助かっています。
周りにC#をやっている人間がいないので本当にありがたいです。

エラーや開発環境は常識的に書くものなんですね
ご指摘ありがとうございます。
エラー一覧です
エラーは55行目に""は無効です
')'は無効です
19行目に
;が必要です
;が必要です
;が必要です
20行目に
;が必要です
;が必要です
55行目に
;が必要です
'$'は予期されていません
19行目 無効なトークン '(' が クラス、構造体またはインターフェイスのメンバー宣言で使用されています。 C:\Users\taro\documents\visual studio 2013\Projects\Project14\Project14\CodeFile1.cs 19

エラー 3 無効なトークン '(' が クラス、構造体またはインターフェイスのメンバー宣言で使用されています。 C:\Users\taro\documents\visual studio 2013\Projects\Project14\Project14\CodeFile1.cs 20
エラー 3 無効なトークン '(' が クラス、構造体またはインターフェイスのメンバー宣言で使用されています。 C:\Users\taro\documents\visual studio 2013\Projects\Project14\Project14\CodeFile1.cs 20
エラー 3 無効なトークン '(' が クラス、構造体またはインターフェイスのメンバー宣言で使用されています。 C:\Users\taro\documents\visual studio 2013\Projects\Project14\Project14\CodeFile1.cs 20
こういうエラーがでてきました。
エラーの数が30個だったのは他のソースコードが同プロジェクト内に入っていたようです。

開発環境はVisual Studio 2013 です。



引用返信 編集キー/
■76891 / inTopicNo.7)  Re[5]: C#のインターフェイスの実装についてです
□投稿者/ 魔界の仮面弁士 (466回)-(2015/08/26(Wed) 12:54:48)
No76890 (EDF さん) に返信
> 開発環境はVisual Studio 2013 です。

先に書いたように、EDF さんが提示したサイトに掲載されているソースコードは
最新版である 2015 に向けたものです。

あのサイトを使って勉強するつもりなのであれば、
開発環境も 2015 にそろえることをお奨めします。

引用返信 編集キー/
■76892 / inTopicNo.8)  Re[5]: C#のインターフェイスの実装についてです
□投稿者/ 魔界の仮面弁士 (467回)-(2015/08/26(Wed) 13:38:01)
2015/08/26(Wed) 13:46:21 編集(投稿者)

No76890 (EDF さん) に返信
> エラー一覧です

まずは 55 行目の「'$'は予期されていません」から説明しましょうか。
>> Console.WriteLine($"({p.X:N3}, {p.Y:N3}), radius = {p.Radius:N3}, angle = {p.Angle:N3}");

C# 6.0 においては、
 int hoge = 123;
 string s = String.Format("{0}を小数部3桁で{0:N3}、16進数小文字4桁で{0:X3}と表記", hoge);
というコードを
 int hoge = 123;
 string s = $"{hoge}を小数部3桁で{hoge:N3}、16進数小文字4桁で{hoge:X3}と表記";
と書けるようになりました。

この $"〜〜" 表記は、補間文字列式(Interpolated Strings)と呼ばれており、
Visual Studio では 2015 からサポートされました。
それより前のバージョンには無いリテラルなので、今回お使いの VS2013 では解釈できません。


------------------

次は、19 行目のあたり。具体的には
>> public double Radius => Math.Sqrt(X * X + Y * Y);
ですね。

『=>』というのは、「ラムダ式」と呼ばれる構文であり、C# 3.0 から追加されました。
しかし、それをメソッド本体を定義するために使えるようになったのは、C# 6.0 すなわち VS2015 からです。

VS2013 の場合は、上記を
 public double Radius { get { return Math.Sqrt(X * X + Y * Y); } }
と書き換えてください。20 行目も同様です。

------------------

その他、10 行目の
>> public double X { get; }
および、15 行目の
>> X = x;
の部分にも、C# 6.0 の新機能が使われていますが、
ここは質問されていないので説明を省略。


いずれの箇所も、下位バージョン向けに書き換えたコードを既に回答していますので、
VS2015 未満で試す場合には、それらのコードに置き換えて試してみてください。
引用返信 編集キー/
■76894 / inTopicNo.9)  Re[6]: C#のインターフェイスの実装についてです
□投稿者/ EDF (19回)-(2015/08/26(Wed) 19:32:29)
ありがとうございます。まだこんなに短いコードでも最近追加された機能が盛り込まれているとは知りませんでした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -