1

クラスmembers(value)の1つに条件(pred)が成立したときに、オブジェクト(mycapsule、他の多くのメンバーがあります)のリストを更新したいと思います。私が何かを変更するたびに、別のことが失敗します。私はC#の初心者であり、本当に混乱しています。誰かが私のコードを修正できますか:最良の状態では、このエラーが発生するだけですが、コードに多くのものが欠けていると思います

The type or namespace name `T' could not be found. Are you missing a using directive or an assembly reference?

これが私のコードです

using System;
using System.Collections.Generic ;
namespace test
{
    class MainClass
    {
        public static List< mycapsule<int,double> > sample=  new List< mycapsule<int,double>>();
        public static void Main (string[] args)
        {

            sample.Add(new mycapsule<int,double> {id=1 , value= 1.2});
            update(pred, 12.3);
        }

        public static bool pred(double x)
        {
            if (x==2.5) return true;
            return false;
        }
        public class mycapsule<KT, T>
        {
            public KT id {get ; set; } 
            public T value { get ; set; }
            public int p; // and more

        }    

        public bool update(Func<T, bool> predicate, T i)
        {
            foreach (var x in sample.FindAll(item => predicate(JustValue(item))) )
            {
                x.value = i ;
            }
            return true ;
        }



        public T JustValue(mycapsule<int,T> i)
        {
            return i.value;
        }

    }
}
4

3 に答える 3

2

あなたの更新方法を見てください:

public bool update(Func<T, bool> predicate, T i)
{
    foreach (var x in KeyRecord.FindAll(item => predicate(JustValue(item))) )
    {
        x.value = i ;
    }
    return true ;
}

あなたはここに何を期待Tしていますか?メソッドはジェネリックではなく ( として記述されていませんupdate<T>)、ジェネリック クラスで宣言されていません。

あなたがただ望む可能性があります:

public bool update<T>(Func<T, bool> predicate, T i)

KeyRecord.FindAll…が、見た目が分からないとなんとも言えません。ああ、あなたは同じ問題を抱えていJustValueます。

副次的な問題として、メソッド名updateおよびpredは .NET 命名規則に従っておらずJustValue、説明性の点で不十分なメソッド名です。mycapsuleまた、.NET 命名規則にも従っていません。これらのことは、読みやすさの点で本当に重要です。

于 2012-09-07T08:59:27.660 に答える
0

型の安全性の理由により、これは機能しないと思います。コードを可能な限り修正したところ、次のようになりました。

public static List<mycapsule<int, double>> sample = new List<mycapsule<int, double>>();
public static void Main(string[] args)
{
    sample.Add(new mycapsule<int, double> { id = 1, value = 1.2 });
    update(pred, 12.3);
}

public static bool pred(double x)
{
    if (x == 2.5) return true;
    return false;
}

public class mycapsule<KT, T>
{
    public KT id { get; set; }
    public T value { get; set; }
    public int p; // and more
}

public static bool update<T>(Func<T, bool> predicate, T i)
{
    List<mycapsule<int, double>> list = sample.FindAll(item => predicate(JustValue(item)));
    foreach (var x in list)
    {
        x.value = i;
    }
    return true;
}

public static T JustValue<T>(mycapsule<int, T> i)
{
    return i.value;
}

エラーは次のとおりです。

predicate(JustValue(item)) => Argument 1: cannot implicitly convert from double to T

これは、 であることがわかっている値を持つジェネリック型T( )を取ると指定したメソッドを強制的に呼び出そうとしているためです。の呼び出しから double になることはわかっていますが、互換性のない型を取る述語を渡すことを妨げるものは何もありません。Func<T, bool>doubleTupdate(pred, 12.3);

public static bool pred(string x)
{
    return false;
}

update(pred, "asdf");

これは明らかに矛盾しています。コンパイラは単に、誤って自分の足を撃たないようにしようとしています。

これを解決するには、コレクションを明示的に update に渡し、method型の一貫性を確保します。

public static List<mycapsule<int, double>> sample = new List<mycapsule<int, double>>();
public static void Main(string[] args)
{
    sample.Add(new mycapsule<int, double> { id = 1, value = 1.2 });
    update(pred, 12.5, sample);
}

public static bool pred(double x)
{
    if (x == 2.5) return true;
    return false;
}

public class mycapsule<KT, T>
{
    public KT id { get; set; }
    public T value { get; set; }
    public int p; // and more
}

public static bool update<T>(Func<T, bool> predicate, T i, List<mycapsule<int, T>> list)
{
    foreach (var x in list.FindAll(item => predicate(JustValue(item))))
    {
        x.value = i;
    }
    return true;
}

public static T JustValue<T>(mycapsule<int, T> i)
{
    return i.value;
}
于 2012-09-07T09:30:09.683 に答える
0

これを試してみてください。ジェネリックメソッドの場合、使用したメソッド定義は正しくありません。
そのはず

//MethodName<T,U>(T para1, U para2)

リフレクションを含めるようにコードを変更しました。これは機能するはずです。試してみて、フィードバックをお寄せください。

using System;
using System.Collections.Generic;
using System.Reflection;
namespace test
{
    class MainClass
    {
        public static List<Mycapsule<int, double>> sample = new List<Mycapsule<int, double>>();

        public static void Main(string[] args)
        {

            sample.Add(new Mycapsule<int, double> { id = 1, value = 1.2 });
            update(pred, 12.3);
        }

        public static bool pred(double x)
        {
            if (x == 2.5) return true;
            return false;
        }

        public static bool update<T>(Func<T, bool> predicate, T i)
        {
            var myCollection = sample.FindAll(p => pred(JustValue<double>(p)));
            MainClass mainClass = new MainClass();
            foreach (var x in myCollection)
            {
                MethodInfo changeTypeMethod = typeof(MainClass).GetMethod("GetValue");
                object value = changeTypeMethod.Invoke(mainClass, new object[] { i, typeof(T) });
                PropertyInfo valueProperty = x.GetType().GetProperty("value");
                valueProperty.SetValue(x, value);
            }
            return true;
        }

        public T GetValue<T>(T i)
        {
            return (T)Convert.ChangeType(i, typeof(T));
        }

        public static T JustValue<T>(Mycapsule<int, T> i)
        {
            return i.value;
        }
    }
    //Outside the MainClass inside the same namespace 
    public class Mycapsule<KT, T>
    {
        public KT id { get; set; }
        public T value { get; set; }
        public int p; // and more   

    }
}
于 2012-09-07T09:09:09.327 に答える