一种接受不同参数的方法

Ita*_*y.B 4 .net c#

使用FW 4.5.1我有一个方法:

void DoSomething(string s)
Run Code Online (Sandbox Code Playgroud)

我想允许函数也接受int,但是在相同的参数下.这意味着我想写:

void DoSomething(var s)
Run Code Online (Sandbox Code Playgroud)

有时sint,有时string.

我怎样才能做到这一点?

Jon*_*eet 17

您可以考虑三个选项,具体取决于您实际尝试实现的目标:

使用重载

public void DoSomething(int s) { ... }
public void DoSomething(string s) { ... }
Run Code Online (Sandbox Code Playgroud)

只会接受intstring- 这可能是好事还是坏事,取决于你想要实现的目标.如果你真的只希望能够接受intstring,这是国际海事组织的最佳解决方案.

使用 object

public void DoSomething(object s) { ... }
Run Code Online (Sandbox Code Playgroud)

这将允许您传递任何内容.

使用泛型

public void DoSomething<T>(T value) { ... }
Run Code Online (Sandbox Code Playgroud)

这仍然允许您传入任何内容,但是如果(比方说)您希望稍后接受两个必须是相同类型的值(或至少是兼容类型),则会提供更多的类型安全性

  • 我认为最好编辑答案,让顶部的重载看到,因为这是你认为最好的 (2认同)

juu*_*nas 11

你可以通过重载实现你想要的.

void DoSomething(string s){ DoSomething(int.Parse(s)); }
void DoSomething(int s){ /* Your code here */ }
Run Code Online (Sandbox Code Playgroud)

或者反过来说:

void DoSomething(string s){ /* Your code here */ }
void DoSomething(int s){ DoSomething(s.ToString()); }
Run Code Online (Sandbox Code Playgroud)


Car*_*ine 5

您可以使用泛型

void MyMethod<T>(T param)
{
    if (typeof(T) == typeof(int))
    {
        // the object is an int
    }
    else if (typeof(T) == typeof(string))
    {
        // the object is a string
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这并不是绝对的“泛型”,因为它只能真正处理两种类型-如果仅要支持两种类型,则我将使用重载。 (4认同)
  • 同意@JonSkeet我确定OP仅需要一种方法,但是如果没有OP想要修改的实际方法,则无法提出更好的实现。 (2认同)