我正在尝试编写一个接受泛型输入的方法,如果输入是默认值则返回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'类型的操作数。
我做错了什么?
答案 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.type
或MyClass.type
您正在寻找的是
typeof(T) == typeof(String)
答案 3 :(得分:0)
有两个无效的内容是T.type == "String" && val == String.Empty
和val == 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 );
}
}