6

最近、 を受け入れるメソッドからGuid型のオブジェクトを返そうとしました<T>が、コンパイラから次のエラーが返されました。

'System.Guid'は、ジェネリック型またはメソッド 'MyGenericMethod' の型パラメーター'T'として使用できません。'System.Guid'から'System.IConvertible'へのボクシング変換はありません。

調査の結果、System.IConvertible インターフェイスを実装していない Guid 型が原因でコンパイラ メッセージが発生したことがわかりました。

MSDNは次のように述べています。

このインターフェイスは、実装型のインスタンスの値を、同等の値を持つ共通言語ランタイム型に変換するメソッドを提供します。

提供されているタイプのリストには、Guid は含まれていません。なぜこれが当てはまるのか、誰かがユースケースを説明/提供できますか?

4

2 に答える 2

13

IConvertibleでは、データをほとんどのプリミティブに変換できる型が必要です。たとえば、Guid を float としてどのように表現しますか?

Guid はインターフェイス メソッドのほとんどを実装できないため、それ以外の方法で自分自身を宣言しないことが期待されます。

さて、本当の質問です。あなたは何を達成しようとしていますか?

于 2012-10-25T10:52:11.030 に答える
1

次のコードが示すように、ジェネリック メソッドの型パラメーターとして System.Guid を使用しても問題はありません。MyGenericMethod メソッドの実装と、そのメソッドを呼び出すコードを投稿していただけますか?

class Program
{
    static void Main(string[] args)
    {
        var test = new GenericTest();
        test.MyGenericMethod(Guid.NewGuid());
    }
}

class GenericTest
{
    public void MyGenericMethod<T>(T t)
    {
    }
}

メソッドの実装には、型パラメーターが IConvertible であることを要求する型制約があるため、次のようになると推測しています。

class Program
{
    static void Main(string[] args)
    {
        var test = new GenericTest();
        test.MyGenericMethod(Guid.NewGuid());
    }
}

class GenericTest
{
    public void MyGenericMethod<T>(T t)
        where T : IConvertible
    {
    }
}
于 2012-10-25T11:00:22.327 に答える