通用方法 - 无法将类型“字符串”隐式转换为 T

ada*_*iko 3 c# generics interface

可能是一个简单的问题..

我有一个界面:

public interface ISanitizer
{
    T Sanitize<T>(T data_);
}
Run Code Online (Sandbox Code Playgroud)

和一个实现类:

    public class BasicFilenameSanitizer : ISanitizer
    {

        private readonly String m_replacementCharacter = String.Empty;

        public BasicFilenameSanitizer(String replacementCharacter_)
        {
            if (replacementCharacter_ == null)
            {
                throw new ArgumentNullException("replacementCharacter_");
            }

            m_replacementCharacter = replacementCharacter_;
        }


        public virtual T Sanitize<T>(T filename_)
        {
            if (filename_ == null)
            {
                throw new ArgumentNullException("filename_");
            }

            Regex invalidCharacterRegex =
                new Regex(String.Format("[{0}]", Regex.Escape(new string(System.IO.Path.GetInvalidFileNameChars()))));

//error occurs here
            return Regex.Replace(filename_.ToString(), invalidCharacterRegex.ToString(), m_replacementCharacter);
        }

}
Run Code Online (Sandbox Code Playgroud)

Ste*_*hev 7

在我的特定情况下,以下代码生成了相同的错误:

return (T) someData;
Run Code Online (Sandbox Code Playgroud)

是什么帮助了我 - 使用对象进行双重转换:

例如:

    static T MyFunction<T>() {
        string s = "test";

        if (typeof(T) == typeof(byte[]))
            return (T)(object)System.Text.Encoding.ASCII.GetBytes(s);
        else if (typeof(T) == typeof(string))
            return (T)(object)s;
        else throw new Exception();
    }
Run Code Online (Sandbox Code Playgroud)

...

            var ba = MyFunction<byte[]>();
            var bs = MyFunction<string>();
Run Code Online (Sandbox Code Playgroud)

  • 到对象然后到我的通用 T 类型的中间转换对我来说是什么:`(T)(object)(s)`。谢谢! (2认同)

Ode*_*ded 6

在您的代码中,您string从泛型类型返回 a ,该类型可以是任何类型。

如果您想要通用返回类型,请将您的代码更改为:

public interface ISanitizer<T>
{
    T Sanitize(T data_);
}

public class BasicFilenameSanitizer : ISanitizer<string>
Run Code Online (Sandbox Code Playgroud)

如果您只想始终返回 a string,则只需更改方法返回类型:

public interface ISanitizer
{
    string Sanitize<T>(T data_);
}

public virtual string Sanitize<T>(T filename_)
Run Code Online (Sandbox Code Playgroud)