6

我正在尝试编写一个接受通用输入的方法,如果输入是默认值则返回 null ,否则返回 XElement 。

顺便说一句,我对通用方法很熟悉,而且显然在 google-fu 上。

这是我到目前为止所拥有的:

public static class ConversionClass<T>
{
    public static XElement newXElementOrNull<T>(string name, T val)
    {
        if ((T.type == "String") && (val == String.Empty))
        {
            return null;
        }

        if (val == default(T))
        {
            return null;
        }
        else
        {
            return new XElement(name, val);
        }
    }
}

出于某种原因,C# 不喜欢这样。

它拒绝方法签名(newXElementOrNull)说:

类型参数“T”与外部类型“AddXMLTest.Converter”中的类型参数同名

它突出显示尖括号中的 T 和参数中的 T。

更糟糕的是,它不喜欢 val == default(T) 部分,因为它说运算符“==”不能应用于“T”和“T”类型的操作数。

我究竟做错了什么?

4

4 回答 4

6

显然这个方法在一个已经指定的类中<T>。这意味着您可以省略此类型参数,泛型类的方法也自动泛型。

我预计也会T.type导致错误,但这取决于外部类的类型约束。要获得完整答案,请发布该类的外部定义(不是所有成员)。

它不喜欢val == default(T)

这很可能是第一个的后续错误。

于 2013-03-08T19:02:21.093 回答
3

类型参数“T”与外部类型“AddXMLTest.Converter”中的类型参数同名

所以这个方法之外的类(未显示)也必须使用<T>。你将无法做到这一点。将其命名(在方法上)类似于<K>.

更糟糕的是,它不喜欢 val == default(T) 部分,因为它说运算符“==”不能应用于“T”和“T”类型的操作数。

当您停止使用<T>并将其更改为类似default(K).

此外,我很确定这T.type不会编译。我很确定评估应该是这样的:

if ((val is typeof(string) && string.IsNullOrEmpty(val))
于 2013-03-08T19:03:58.177 回答
1

你不能T.type比你能做的更快,String.type或者MyClass.type

你正在寻找的是类似的东西

typeof(T) == typeof(String)
于 2013-03-08T19:05:03.957 回答
0

有两个无效的东西是T.type == "String" && val == String.Emptyval == default(T)。关于什么:

public static XElement newXElementOrNull<T>( string name, T val ) {
   if ( typeof(T) == typeof(String) && val.ToString() == String.Empty ) {
      return null;
   }

   if ( EqualityComparer<T>.Default.Equals( val, default( T ) ) ) {
      return null;
   }
   else {
      return new XElement( name, val );
   }
}
于 2013-03-08T19:08:08.447 回答