1

良い一日、

実行時まで型がわからない Type T の値を格納するために使用されるクラスがあります。正しい用語が何であるかわからない、特定の型 (この場合は null 許容の 10 進数) を型オブジェクトに戻します。

私のコードレイアウトを許してください:

クラスのスニペット:

public abstract class Types
    {
        public class ValueField<T>
        {
            [XmlAttribute]
            public int TemplateID { get; set; }

            [XmlAttribute]
            public int FieldID { get; set; }

            [XmlIgnore]
            [ScriptIgnore]
            public TemplateApprovalField Field { get; set; }

            [XmlIgnore]
            [ScriptIgnore]
            public InstanceTemplateActivityValues Values { get; set; }

            [XmlAttribute]
            public T Value { get; set; }
        }
    }

関数スニペット:

「values.Add((Types.ValueField)field);」という行で立ち往生しています。キャストする方法がわかりません。その時点で、var フィールドは Types.ValueField です。

 Values = new Func<XmlDocument, List<Types.ValueField<object>>>(xml =>
 {
  List<Types.ValueField<object>> values = new List<Types.ValueField<object>>();

if (xml != null)
{
  foreach (XmlNode node in xml.SelectNodes("//Field"))
  {

    if (node.Attributes["Type"].Value == "Numeric")
      {
        var field = new Types.ValueField<decimal?>()
        {
          Field = ApprovalFields.Find(f => f.FieldID == int.Parse(node.Attributes["ID"].Value)),
          FieldID = int.Parse(node.Attributes["ID"].Value),
          TemplateID = int.Parse(node.SelectSingleNode("../@ID").Value)
        };
        field.Value = new Func<string, decimal?>(val =>
          {
            if (string.IsNullOrEmpty(val))
              return null;
            else
            {
              decimal parsed = 0;
              if (decimal.TryParse(val, out parsed))
                return parsed;
            }
            return null;
        })(node.InnerText);


      values.Add((Types.ValueField<object>)field); //This is where my problem occurs...
   }
 }


}
   return values;
   })(row["Form_Values"] != DBNull.Value ? 
      new XmlDocument() { InnerXml =  row["Form_Values"].ToString() } : null)

どんな入力でも大歓迎です。

よろしくYP

4

1 に答える 1

4

を作成していValueField<decimal?>ます。それValueField<object>違います - あなたのクラスValueField<T>は で共変でTはありません。(クラスを共変にすることはできず、API もT"in" の位置に含まれます。)

これが機能しない理由を示すには、次のようにします。

 Value<decimal?> foo = new Value<decimal?>();
 Value<object> bar = foo; // Imagine this worked
 bar.Value = "hello";
 decimal? x = foo.Value;

それが何をすることを期待しますか?2 番目の行以外はすべて非難されることはないので、2 番目の行を失敗させる必要があります。

ここでの簡単な答えはValue<object>、 の代わりに を最初に作成することValue<decimal?>です。

于 2012-12-06T07:12:32.333 に答える