Я возьму противоположный подход и скажу: не делай этого.Лучшее из опубликованных решений (использование альтернативного типа, такого как FileInfo или Uri для одной из перегрузок) мне кажется немного хакерским - идет вразрез с принципом наименьшего удивления.
Если вы можете построить, используясодержание только без имени файла, следовательно, имя файла не является обязательным.И точно так же, если вы можете создать только с именем файла, из этого следует, что содержание не является существенным.Предположительно вы можете впоследствии установить отсутствующее имя файла / содержимое позже, например, установив свойство:
MyObject myObject = new MyObject(fileName);
myObject.Content = ...
MyObject myObject = new MyObject(content);
myObject.FileName = ...
Вместо того, чтобы пытаться бороться с ним, выберите один из ваших параметров как наиболее важный (fileName в следующем примере) и создайте два конструктора следующим образом:
public MyObject(string fileName) : this(fileName, null)
{
}
public MyObject(string fileName, string content)
{
... implementation
}
Вы можете разрешить передачу значения null для одного или обоих параметров, если это имеет смысл.И вы можете настаивать на том, что по крайней мере один из них не равен нулю, если это уместно:
public MyObject(string fileName, string content)
{
if (fileName == null && content == null) throw new ArgumentException(...);
...
}
Короче, не используйте хаки для обхода подобных ограничений.