Copy autodiscovery results from list to an array
You certainly can! You're currently coding using the "arrow pattern" it's often nicer to return early rather than keep indenting further and further as you nest conditionals.

if (findResponse == null) 
{
     return new EndpointAddress[0];
}


Now let's make the rest of the method shorter:

public static EndpointAddress[] Find()
{
    var discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
    var findResponse = discoveryClient.Find(
        new FindCriteria(
            typeof(ICommunicationService)));

    if(findResponse == null) 
    {
        return new EndpointAddress[0];
    }
    return findResponse.Endpoints.Select(endpoint =&gt; endpoint.Address).ToArray();
}


But, we can go further. You should prefer returning interfaces rather than concrete representations. Do you need indexed access to the EndpointAddresses? I doubt it, return IEnumerable&lt;EndpointAddress&gt; instead:

public static IEnumerable&lt;EndpointAddress&gt; Find()
{
    var discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
    var findResponse = discoveryClient.Find(
        new FindCriteria(
            typeof(ICommunicationService)));

    if(findResponse == null) 
    {
        return Enumerable.Empty&lt;EndpointAddress&gt;();
    }
    return findResponse.Endpoints.Select(endpoint =&gt; endpoint.Address);
}


You could also inject the DiscoveryClient into the classes constructor but as it is a static method and I don't know what the rest of the class looks like, I'll leave that point for now.