52846


関数array_typeのコメント部に書いてあるようにidx[0]と書いて画面に表示したり  
== や> < などを使って比較したりしたいのですがどうすればいいのでしょうか？

質問ですが参照と値型ではジェネリックでも書き分けるしかないのでしょうか？

[code]

                    static void array_type<type>(type idx,type id)
                        where type : class,ICollection
                    {
    
                        Console.WriteLine(idx[0]);//idx[0];と書きたい。
    
    
                        //foreach(var x in idx)
                        //{
                        //    Console.WriteLine(x);
                        //}
    
                        //for(int i=0; i< idx.Count; i++)
                        //{
    
                        //}
    
                    }
                    static void Main(string[] args)
                    {
    
                        //dtest a = () => { Console.WriteLine("delegate"); };
    
                        //int[] str = new int[] {1,2,3,4,5,6,7,8,9,10};
                        string[] str = new string[3] { "aaa", "bb", "ccc" };
                        string[] str2 = new string[3] { "aaavvvvvvvvvvv", "bb", "ccc" };
    
    
                        array_type<string[]>(str,str2);
    
[/code]


CC BY-SA 4.0
2019-02-17T07:45:49.043
52824
2019-02-18T07:19:29.553
question
c#
ジェネリック型の参照型を[]インデックスで操作するためのインターフェイスが知りたい


> []インデックスで操作するためのインターフェイスが知りたい

`IList` インターフェイスにはインデクサが定義さています。  
配列はこのインターフェイスを実装しているので適用可能です。

> == や> < などを使って比較したりしたいのですがどうすればいいのでしょうか？

演算子を使用することは基本的にはできません。  
一般的には `Equals` や `CompareTo` メソッドを使用して比較演算を行います。

> 参照と値型ではジェネリックでも書き分けるしかないのでしょうか？

必要がなければ書き分ける必要はありません。  
ちなみに参照型に制約するには `class`, 値型に制約するには `struct` を型制約に宣言します。

* * *

以下、実装サンプルです。  
`ArrayTypeB`のほうが配列要素の比較等が可能なためおすすめです。

[code]

    static void ArrayTypeA<T>(T idx)
        where T : IList
    {
        for (int i = 0; i < idx.Count; ++i)
        {
            Debug.WriteLine($"A. idx[{i}] = " + idx[i]);
        }
    }
    
    static void ArrayTypeB<T>(IList<T> idx)
        where T : IEquatable<T>, IComparable<T> 
    {
        for (int i = 0; i < idx.Count; ++i)
        {
            Debug.WriteLine($"B: idx[{i}] = " + idx[i]);
        }
    
        Debug.WriteLine("idx[0] equals idx[1]: " + idx[0].Equals(idx[1]));
        Debug.WriteLine("idx[0] compareTo idx[1]:" + idx[0].CompareTo(idx[1]));
    }
    
    public void Test()
    {
        var strings = new string[] { "A1", "A2" };
        ArrayTypeA(strings);
        ArrayTypeB(strings);
    
        var numbers = new int[] { 1234, 1234 };
        ArrayTypeA(numbers);
        ArrayTypeB(numbers);
    }
    
[/code]


CC BY-SA 4.0
2019-02-18T07:05:12.587
52846
2019-02-18T07:19:29.553
2019-02-18T07:19:29.553
14817
14817
52824
answer