2012-07-04 48 views
2

CA1004: Generic methods should provide type parameterCA1004和异常/错误处理援助

public static void IfNullAndNullsAreIllegalThenThrow<T>(object value) 
{ 
    if (value == null && !(default(T) == null)) 
     throw new ArgumentException("Nulls are not allowed for this object."); 
} 

我发现这个方法在网上,这是非常有用的是诚实的。但是,它违反了CA1004规则。我不确定是否有更好的方法来设计方法而不违反规则。


使用范例:

public class SomeClass<T> 
{ 
    public void SomeMethod(object obj) 
    { 
     // Ensure the actual object is not null if it shouldn't be. 
     ThrowHelper.IfNullAndNullsAreIllegalThenThrow<T>(obj); 

     // ... 
    } 
} 

回答

2

这看起来像一个辅助方法,它仅在内部使用。使它internal而不是public和警告应该消失。

+0

但是,如果您想在一个或多个程序集中使用这些辅助方法,这不是解决方案。所以你需要复制代码。 –

1

CA1004警告你,泛型类型参数不能从方法签名推断。基本上,这意味着你只能调用它是这样的:如果重新定义的方法,以便它的参数是T类型的

Something obj = GetSomething(); 
IfNullAndNullsAreIllegalThenThrow<Something>(obj); 

在另一方面,则一般类型参数可以从物体推断通过:

public static void IfNullAndNullsAreIllegalThenThrow<T>(T value) 
{ 
    if (value == null && !(default(T) == null)) 
     throw new ArgumentException("Nulls are not allowed for this object."); 
} 

所以,你可以简单的写:

Something obj = GetSomething(); 
IfNullAndNullsAreIllegalThenThrow(obj); 
+2

我认为改变方法的签名会使它无用。 – Henrik

+0

问题是我需要的参数是类型的对象,因为那是进入另一种方法进行检查的对象的类型。 –

+0

@亨利克,你能详细解释一下为什么吗?我试图考虑所有角度和恕我直言,'T'和'价值'在'if'条件下仍然有意义...... –