参数'T'与type参数同名

时间:2013-03-08 18:59:37

标签: c# generics

我正在尝试编写一个接受泛型输入的方法,如果输入是默认值则返回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)部分,因为它表示Operator'=='不能应用于'T'和'T'类型的操作数。

我做错了什么?

4 个答案:

答案 0 :(得分:5)

显然,此方法位于已指定<T>的类中。这意味着您可以省略此类型参数,泛型类的方法也是自动通用的。

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

  

它不喜欢val == default(T)

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

答案 1 :(得分:3)

  

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

因此,此方法之外的类(未显示)也必须使用<T>。你将无法做到这一点。将其命名(在方法上),例如<K>

  

更糟糕的是它不喜欢val == default(T)部分,因为它表示Operator'=='不能应用于'T'和'T'类型的操作数。

当您停止使用<T>并将其更改为default(K)之类的内容时,应该解决此问题。

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

if ((val is typeof(string) && string.IsNullOrEmpty(val))

答案 2 :(得分:1)

你可以T.type完成String.typeMyClass.type

您正在寻找的是

typeof(T) == typeof(String)

答案 3 :(得分: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 );
   }
}
相关问题