C#のオーバーロードが正しくない事がある

投稿者:onichan 投稿日:2024/04/21(Sun) 22:52:48 No.2371

いつもお世話になっております。

object[]またはdynamic[]を引数に取るメソッドに、プロデルで型固定された配列を入れようとすると、期待通りのオーバーロードが選択されない事があるようです。

```プログラム例(cs)
using System.Linq;
using Produire;

namespace ClassLibrary1
{
public class Class1 : IProduireGlobalClass
{
[自分で]public object[] スライス([を] object[] 内容) => 内容.Take(5).ToArray(); //要素型を問わず配列はこちらのメソッドで受け付けたい
[自分で]public string スライス([を] string 内容) => 内容.Substring(0, 5);
}
}
```

```プログラム例(rdr)
「(省略)\ClassLibrary1.dll」を利用
{1,2,3,4,5,6}をスライスして表示 //{1,2,3,4,5}
「123456」をスライスして表示 //12345

【A:整数の配列】={1,2,3,4,5,6}
Aをスライスしたものの種類名を表示 //object[]側のメソッドが呼ばれてほしいがstring側が呼ばれる
```

状況:Pythonのスライサーを再現するメソッドを作っている際に発覚しました。

プロデルバージョン:1.9.1209〜1.9.1239
C#7.3 .NET Framework 4.8.9232.0 コンパイラ4.9.0-3.24121.1(a98c90d5)

よろしくお願いいたします。

結果に関しては変わることがあります

投稿者:ゆうと <yutopia あっとまーくutopiat.net> 投稿日:2024/04/14(Sun) 13:31:42 No.2370

こんにちは

「元実体」設定項目に関しては、プログラムを確認しておきます。
ただ、「元実体」設定項目の結果に関しては、おまけ機能という位置づけですので、バージョンアップ等で今後もかなり変える可能性があります。この結果に依存したプログラムの作成はできるだけ避けてください。
(限られた開発時間の中で、このような点に対応しているとメインの開発が進まなくなりますので)

そもそも「元実体」設定項目でどのようなことをしているのかも含めて教えてください。
場合によっては標準で対応したり、代替となる機能を用意したいと思います。

一部の項目にしかアクセスできませんでした

投稿者:Milkeyyy 投稿日:2024/04/13(Sat) 08:21:06 No.2369

こんにちは。
いつもお世話になっております。

修正を確認できたと返信してしまったのですが、完全には修正されていないことに気づいたので再度報告させていただきます。

「元実体」設定項目にアクセスすることはできるようになったのですが、元実体に含まれる設定項目が以前とは異なり、一部の項目にしかアクセスできなくなっていました。
バージョン 2.0.1216 までは、通常の設定項目には存在しない項目にもアクセスできていました。

検証用のプログラムも添付させていただきます。
よろしくお願い致します。

◆動作環境情報◆
プロデル 2.0.1235
Windows 11 Pro 64ビット
メモリ:31.9 GB

ーー検証用プログラム
メイン画面を表示する
待機する

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
    ーー自動生成された手順です。ここに書き加えたプログラムは消える可能性があります
    初期化開始する
    この実質大きさを{284,339}に変える
    この内容を「メイン画面」に変える
    この文字色を「標準の文字」に変える
    チェックボックス1というチェックボックスを作る
      その位置と大きさを{13,287,104,24}に変える
      その内容を「チェックボックス1」に変える
      その移動順を6に変える
      その文字色を「標準の文字」に変える
    オプション1というオプションを作る
      その位置と大きさを{13,256,104,24}に変える
      その内容を「オプション1」に変える
      その移動順を5に変える
      そのフォーカス移動可能を○に変える
      その文字色を「標準の文字」に変える
    ラベル1というラベルを作る
      その位置と大きさを{13,98,100,23}に変える
      その内容を「ラベル1」に変える
      その移動順を4に変える
      その文字色を「標準の文字」に変える
    テキスト領域1というテキスト領域を作る
      その位置と大きさを{13,149,100,100}に変える
      その移動順を3に変える
    テキスト1というテキストを作る
      その位置と大きさを{13,124,100,19}に変える
      その移動順を1に変える
    ボタン1というボタンを作る
      その位置と大きさを{13,13,223,79}に変える
      その内容を「ボタン1」に変える
      その移動順を2に変える
      そのドラッグドロップを○に変える
      その文字色を「標準の文字」に変える
    初期化終了する
  終わり
  
  開いた時の手順
    自分の内容=プロデルのバージョン
    自分の子部品一覧を【子部品】へそれぞれ繰り返す
      子部品の種類名&「: 」&(子部品の元実体が無でない)を報告する
      「- [[子部品の元実体]から型情報を取得したものから設定項目一覧を取得したものすべての名前]」を報告する
    繰り返し終わり
  終わり
終わり

Re: 修正しました

投稿者:Milkeyyy 投稿日:2024/04/13(Sat) 07:52:38 No.2368

こんにちは。
2.0.1235 で修正確認できました。

迅速な対応ありがとうございました。

修正しました

投稿者:ゆうと <yutopia あっとまーくutopiat.net> 投稿日:2024/04/13(Sat) 00:50:53 No.2367

こんにちは、ゆうとです。
いつもお世話になっております。

> 「ラベル」や「ボタン」などの部品では「元実体」プロパティにアクセスできるのですが、
> 「テキスト」と「テキスト領域」の「元実体」プロパティにアクセスすると「無」となり、アクセスできません。

検証用プログラムとても助かります。
状況を再現でき、内部仕様の変更が原因と判明しました。
最新版2.0.1235/1.9.1235で修正済みですのでご確認ください。

ご指摘ありがとうございます。

テキスト部品の元実体にアクセスできない

投稿者:Milkeyyy 投稿日:2024/04/06(Sat) 10:30:21 No.2365

お世話になっております。

「ラベル」や「ボタン」などの部品では「元実体」プロパティにアクセスできるのですが、
「テキスト」と「テキスト領域」の「元実体」プロパティにアクセスすると「無」となり、アクセスできません。

バージョン 2.0.1216 までは問題なくアクセスできたのですが、バージョン 2.0.1218 からこの現象が発生するようになったようです。

よろしくお願い致します。

◆動作環境情報◆
プロデル 2.0.1234
Windows 11 Pro 64ビット
メモリ:31.9 GB


ーーサンプルプログラム

メイン画面を表示する
待機する

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
    ーー自動生成された手順です。ここに書き加えたプログラムは消える可能性があります
    初期化開始する
    この実質大きさを{284,339}に変える
    この内容を「メイン画面」に変える
    この文字色を「標準の文字」に変える
    チェックボックス1というチェックボックスを作る
      その位置と大きさを{13,287,104,24}に変える
      その内容を「チェックボックス1」に変える
      その移動順を6に変える
      その文字色を「標準の文字」に変える
    オプション1というオプションを作る
      その位置と大きさを{13,256,104,24}に変える
      その内容を「オプション1」に変える
      その移動順を5に変える
      そのフォーカス移動可能を○に変える
      その文字色を「標準の文字」に変える
    ラベル1というラベルを作る
      その位置と大きさを{13,98,100,23}に変える
      その内容を「ラベル1」に変える
      その移動順を4に変える
      その文字色を「標準の文字」に変える
    テキスト領域1というテキスト領域を作る
      その位置と大きさを{13,149,100,100}に変える
      その移動順を3に変える
    テキスト1というテキストを作る
      その位置と大きさを{13,124,100,19}に変える
      その移動順を1に変える
    ボタン1というボタンを作る
      その位置と大きさを{13,13,223,79}に変える
      その内容を「ボタン1」に変える
      その移動順を2に変える
      そのドラッグドロップを○に変える
      その文字色を「標準の文字」に変える
    初期化終了する
  終わり
  
  開いた時の手順
    自分の内容=プロデルのバージョン
    自分の子部品一覧を【子部品】へそれぞれ繰り返す
      子部品の種類名&「: 」&(子部品の元実体が無でない)を報告する
    繰り返し終わり
  終わり
終わり

反映を確認しました

投稿者:アーク 投稿日:2024/04/03(Wed) 21:16:39 No.2364

お世話になっております。アークです。

最新版にて正常に色分けされて実行も可能な事を確認しました。
他の1万行を超えるプログラムでも問題なく実行可能になりました。
対応ありがとうございました。

長文コーディングで気を付けるべき事など有りますでしょうか。
こちらでもより安全な方法を採りたいと考えております。

実行ファイルにできました

投稿者:アーク 投稿日:2024/04/03(Wed) 21:06:50 No.2363

お世話になっております。アークです。

最新版にて32bit版で実行ファイルにできる事を確認しました。
ありがとうございました。

修正確認しました。

投稿者:onichan 投稿日:2024/04/03(Wed) 08:35:06 No.2362

お世話になっております。

現象1について1.9.1234で修正されていることを確認いたしました。
また現象2も今後修正検討とのことで承知いたしました。

ご対応いただきありがとうございます。
今後ともよろしくお願いいたします。

Re: 配列の型を固定した時の挙動について

投稿者:ゆうと 投稿日:2024/04/03(Wed) 03:36:10 No.2361

こんにちは、詳しいご報告ありがとうございます。

> 現象1:プロデルで定義した種類で配列の型を固定しようとすると要素が無になるようです。

こちらは再現でき、バグであることを確認しました。
最新版2.0.1234/1.9.1234で修正済みです。


> 現象2:型が固定された配列が"配列である"か判別できなくなっているようです。

こちらについても状況再現できました。
意図しない仕様変更が起きていますが、すぐの対処が難しいため検討して修正します。

> (3月28日追記)[Aが配列基礎である]という書き方であれば目的の動作になる事に気づきました。こちらが正しい書き方であれば無視して頂いて大丈夫です。

この表記で書くことは、想定していませんので、今後のバージョンで使えなくなります。ご承知おきください。
(マニュアルに記載がない種類名/手順については予告なく変更する場合があります)

よろしくお願いします。

▲ページの先頭へ

- WebForum -