

こんにちは。

LINQでXMLからデータを取得し、そのデータをそれぞれの型に格納し、それを返すメソッドを作りたいと思います。  
しかし、「Null許容型はダメ」とか「型を明示しろ」とか言われて全然できません。  
自分で作った方を使ったジェネリック関数は作れないのでしょうか？

※型それぞれのインスタンスの中身を作る処理については、 PropertiesInfo で対応できているので、こちらは大丈夫です。

■テーブルの型

[code]

    class Offices {
        int No;
        String Data;
    }
    
    class Workers {
        int No;
        String FullName;
    }
    
[/code]

■コード

[code]

    /** コード１ **/
    public T Func<T>(T Table) where T : struct {
        // ここに、LINQからとったデータをそれぞれの型（T）に格納する処理が入ります。
        return (T)Table;
    }
    
[/code]

⇒エラー：  
CS0453 型 'T' は、ジェネリック型のパラメーター 'T'、  
またはメソッド 'Nullable' として使用するために  
Null 非許容の値型でなければなりません

[code]

    /** コード２ **/
    public Nullable<T> Func<T>(T? Table) where T : struct {
        // ここに、LINQからとったデータをそれぞれの型（T）に格納する処理が入ります。
        return (T)Table;
    }
    
[/code]

⇒エラー：  
CS0411 メソッド 'Func(T?)' の型引数を使い方から推論することはできません。  
型引数を明示的に指定してください


CC BY-SA 4.0
2018-05-04T11:55:27.717
43778
2018-07-31T06:01:15.130
2018-05-04T13:53:00.633
28408
28408
question
c#
ジェネリック型関数の作り方


`Func<T>(... )` と書かないといくら T を書いてもジェネリックにはなりませんよ！  
Linq のメソッドも同じように書いてあるはずですので確認してみてください。

あと、 `where T : struct` ではクラスを受け入れられないので、削除して大丈夫です。


CC BY-SA 4.0
2018-05-04T12:52:43.777
43779
2018-05-04T12:52:43.777
28174
43778
answer


> CS0453 型 'T' は、ジェネリック型のパラメーター 'T'、  
>  またはメソッド 'Nullable' として使用するために  
>  Null 非許容の値型でなければなりません

おそらく `public T Func<T>(T
Table)`というシグネチャのメソッド内部で`Nullable<T>`(=`T?`)のようにnull許容型を使用している場合に発生するエラーメッセージだと思われます。`Nullable<T>`の型引数は`struct`制約が必要ですので、質問のように`where
T: struct`を追加すればよいです。

> CS0411 メソッド 'Func(T?)' の型引数を使い方から推論することはできません。  
>  型引数を明示的に指定してください

これは`Func`の呼び出し側で型推論に失敗しています。質問のコードでは型の曖昧さがないため想定しがたいですが、例えば`Func<T>(T? a =
null) where T:
struct`に対して`Func()`と呼び出すと発生します。通常は`Func<int>()`のように使用する型を明示して解消します。

## 追記

`Offices`は`class`であるので`struct`制約を満たさず、`Func`の型引数として使用することは出来ません。質問に即していえば`Offices`型自体が`null`を許容するため、あえて`Offices?`を使用する必要がないのです。ですのでこれに起因するエラーが表示されています。

おそらく本当に必要なのは`struct`ではなくインターフェイスではないかと思います。  
2個の型に共通のインターフェイスを定義し、それを受け入れるメソッドを実装してみてください。`new()`制約を使用しないのであればジェネリックである必要もありません。


CC BY-SA 4.0
2018-05-04T12:59:57.127
43780
2018-05-04T14:11:47.353
2018-05-04T14:11:47.353
5750
5750
43778
answer